c ++ shared_ptr <map <int,int >>用不同的比较函数初始化了吗?

问题描述

如果我在下面的课程中有一个字段,

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的答案。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...