c++ 更改由变量模板定义的Map的比较器

zqdjd7g9  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(156)

我有下面的代码,

// Type your code here, or load an example.
#include <string>
#include <map>
#include <iostream>

struct alpha{
    alpha() = default;
    alpha(std::string str, int i ) : mystr(str), num(i){}
    std::string mystr{"abc"};
    int num{0};
    bool operator <( const alpha &al ) const
    {
       return ( mystr < al.mystr );
    }
};
struct beta{
    beta() = default;
    beta(std::string str, int i ) : mystr(str), num(i){}
    std::string mystr{"abc"};
    int num{0};
    bool operator <( const beta &b1 ) const
    {
       return ( mystr < b1.mystr );
    }

};

template<template<typename ...> class Tcont, typename... Titem>
struct label_str
{
    Tcont<Titem...> kindA;
};

struct Label_map
{
    label_str<std::map, alpha, beta> al_beta_map;
};

struct big_map
{
    Label_map first;
    Label_map second;
};

int main()
{
    auto a1 = alpha("a1", 1);
    auto a2 = alpha("a2", 2);
    auto a3 = alpha("a3", 3);
    auto a4 = alpha("a4", 4);
    auto a5 = alpha("a5", 5);

    auto b1 = beta("b1", 1);
    auto b2 = beta("b2", 2);
    auto b3 = beta("b3", 3);
    auto b4 = beta("b4", 4);
    auto b5 = beta("b5", 5);

    big_map bigg;

    auto &first_map = bigg.first;
    auto &second_map = bigg.second;

    first_map.al_beta_map.kindA[a5] =  b5;
    first_map.al_beta_map.kindA[a2] =  b2;
    first_map.al_beta_map.kindA[a3] =  b3;
    first_map.al_beta_map.kindA[a4] =  b4;
    first_map.al_beta_map.kindA[a1] =  b1;
    auto &mmmap = first_map.al_beta_map.kindA;
    for ( auto [p,_] : mmmap ) 
        std::cout << "( " << p.mystr << ", " << p.num << " )" << std::endl;
}

我想将alpha和beta的比较器更改为num而不是mystr。我知道我必须编写一个自定义lambda来进行比较,但由于变量模板的原因,我不确定。假设我没有更改alpha和beta的权限,我该如何做?
神箭就在这里

pjngdqdw

pjngdqdw1#

自定义比较器的类型必须作为第三个参数传递给std::map,实际上可以使用变量label_str来发挥优势:

struct num_comparator {
    template <typename T>
    bool operator()(const T &l, const T &r) const {
        return (l.num < r.num);
    }
};
struct Label_map {
    label_str<std::map, alpha, beta, num_comparator> al_beta_map;
};

你可以使用lambda,但它的麻烦是lambda在C++20之前是不可默认构造的,这意味着仅仅std::map<alpha, beta,decltype(global_lambda)>是不够的,你还必须在ctor中显式地传递它。在你的情况下可以这样做,但我认为struct更简单。
请注意,std::map只比较它的键,在您的情况下,alphabeta::operator<从未使用过。

相关问题