c++ shared_ptr<map<int, int>> 用不同的比较函数初始化,有什么办法吗?

c++ shared_ptr<map<int, int>> initialized with different comparison function, any way?

如果我在 class 中有一个字段,如下所示,

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, int, my_comparator> my_map;

my_map m1{my_comparator{false}};

my_map m2{my_comparator{true}};

如果你想为不同的对象自定义内部 map 不同的比较器,你可以模板化 class 来接受一个比较对象,像这样:

template<typename Compare = std::less<int>>
class MyClass 
{
  public:
    std::shared_ptr<std::map<int, 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, int, greater<int>>> my_map;
}

此外,您在作业中缺少“>”。应该是:

my_map = make_shared<map<int, int, greater<int>>>();

如果您想将 class 模板化以使用不同的比较器(正如问题所暗示的那样),请参阅 cigien 的回答。

what other way I can have a shared_ptr<map<int, int>> that in two different object of MyClass, one has less<int> and the other have greater<int> so that the my_map in each object is sorted differently?

您可以将 std::function 指定为比较器的模板参数,如

std::shared_ptr<std::map<int, int, std::function<bool(int,int)>>> my_map;

并用std::less<int>

初始化
my_map = std::make_shared<std::map<int, int, std::function<bool(int,int)>>>(std::less<int>{});

std::greater<int>.

my_map = std::make_shared<std::map<int, int, std::function<bool(int,int)>>>(std::greater<int>{});