当键相等时,为std :: multimap自定义比较功能

时间:2018-08-29 09:37:13

标签: c++ c++11 multimap custom-compare

我想为std::multimap编写一个自定义比较器。我想做的是比较(如果它们相等),然后比较。我正在尝试通过在结构中重载operator()并将函数对象作为第三个参数传递到std::multimap构造函数中来实现这一点。

struct CustomComp {
    bool operator()(int key_lhs, int key_rhs){
        if (key_lhs < key_rhs) return true;
        if (key_lhs == key_rhs) //Check values;
        else return false;
    }
};

multimap<int, int, CustomComp> myMap;

如果两个值都是int,我如何不仅可以访问键,还可以访问这些值?

2 个答案:

答案 0 :(得分:2)

  

我想做的是比较按键,以防它们   等于,然后比较值

否,您无法根据std::multimap进行比较。

我建议改用std::vector< std::pair<int, int> >并简单地排序。 std::pair中的operator<会照顾您想要的。

See output here

std::vector< std::pair<int, int> > vec{ {1,2}, {1,-1},{ 2,2 } ,{ -1,1 } };
std::sort(std::begin(vec), std::end(vec));

更新:阅读完另一个答案(即std::multiset<std::tuple<int, int>>)后,我开始思考std::multiset::insert有多糟糕。

然后,我提出了以下基准测试,该基准测试表明,为什么std::vector应该首先出现在上述问题中。

请参见 Quick benchmark online here

Vector-Sort Vs Multimap-Insertion

答案 1 :(得分:1)

您可以使用std::multiset<std::tuple<int, int>>获得所需的效果。不需要自定义比较器,因为std::tuple使用字典比较(您尝试实现的比较)。