我有下面的代码,
// 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的权限,我该如何做?
神箭就在这里
1条答案
按热度按时间pjngdqdw1#
自定义比较器的类型必须作为第三个参数传递给
std::map
,实际上可以使用变量label_str
来发挥优势:你可以使用lambda,但它的麻烦是lambda在C++20之前是不可默认构造的,这意味着仅仅
std::map<alpha, beta,decltype(global_lambda)>
是不够的,你还必须在ctor中显式地传递它。在你的情况下可以这样做,但我认为struct
更简单。请注意,
std::map
只比较它的键,在您的情况下,alpha
。beta::operator<
从未使用过。