问题描述
如果我在下面的课程中有一个字段,
class MyClass {
public:
shared_ptr<map<int,int>> my_map;
}
默认的map<int,int>
的比较功能是less<int>
,但我想将my_map
初始化为
my_map = make_shared<map<int,int,greater<int>>>();
有时
这不会编译,以其他方式我可以拥有一个shared_ptr<map<int,int>>
,在两个MyClass
的不同对象中,一个拥有less<int>
,另一个拥有greater<int>
,因此每个对象中的my_map
排序是否不同?
解决方法
您可以使用自定义比较器,例如:
struct my_comparator {
bool the_other_way=false;
my_comparator(bool flag) : the_other_way{flag} {}
bool operator()(int a,int b) const
{
return the_other_way ? a > b: a < b;
}
};
并构造一个std::map<int,int,my_comparator>
。
std::map
有一个重载的构造函数,该构造函数将比较器对象的实例作为参数。您可以相应地简单地构造每个地图。
typedef std::map<int,my_comparator> my_map;
my_map m1{my_comparator{false}};
my_map m2{my_comparator{true}};
,
我可以通过什么其他方式拥有
shared_ptr<map<int,int>>
,在两个不同的MyClass
对象中,一个拥有less<int>
,另一个拥有greater<int>
,因此{{1} }中每个对象的排序方式不同?
您可以将my_map
指定为比较器的模板参数,
std::function
并使用std::shared_ptr<std::map<int,std::function<bool(int,int)>>> my_map;
std::less<int>
或my_map = std::make_shared<std::map<int,int)>>>(std::less<int>{});
。
std::greater<int>
,
如果您想为不同的对象使用不同的比较器来自定义内部map
,则可以模板化类以接受比较对象,如下所示:
template<typename Compare = std::less<int>>
class MyClass
{
public:
std::shared_ptr<std::map<int,Compare>> my_map;
};
,然后创建不同的对象:
int main()
{
MyClass<> a; // std::less<int> by default
MyClass<std::greater<int>> b;
}
这里是demo。
,比较器是类型声明的一部分,因此您的成员需要包括比较器类型:
class MyClass {
public:
shared_ptr<map<int,greater<int>>> my_map;
}
此外,您在作业中缺少“>”。应该是:
my_map = make_shared<map<int,greater<int>>>();
如果您想对类进行模板化以使用不同的比较器(如问题所示),请参见cigien的答案。