Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 键相等时std::multimap的自定义比较函数_C++_C++11_Multimap_Custom Compare - Fatal编程技术网

C++ 键相等时std::multimap的自定义比较函数

C++ 键相等时std::multimap的自定义比较函数,c++,c++11,multimap,custom-compare,C++,C++11,Multimap,Custom Compare,我想为std::multimap编写一个自定义比较器。我想做的是比较键,如果它们相等,那么比较值。我试图通过在结构中重载操作符()并在std::multimap构造函数中将函数对象作为第三个参数传递来实现这一点 struct CustomComp { bool operator()(int key_lhs, int key_rhs){ if (key_lhs < key_rhs) return true; if (key_lhs == key_rhs

我想为
std::multimap
编写一个自定义比较器。我想做的是比较键,如果它们相等,那么比较值。我试图通过在结构中重载
操作符()
并在
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;
struct CustomComp{
布尔运算符(){
如果(左键<右键)返回true;
if(key_lhs==key_rhs)//检查值;
否则返回false;
}
};
多重映射myMap;

如果两个键都是int,我如何访问值,而不仅仅是键?

使用
std::multiset
可以达到所需的效果。不需要自定义比较器,因为
std::tuple
使用字典式比较(您正试图实现的比较)

我想做的是比较这些键,以防它们 相等,然后比较值

不,您不能根据值对
std::multimap
进行比较

我建议改为使用
std::vector
,简单地排序。这个

std::vectorvec{{1,2}、{1,-1}、{2,2}、{-1,1};
std::sort(std::begin(vec),std::end(vec));

更新:在阅读了另一个答案(即,
std::multiset
)后,我在想,
std::multiset::insert
有多糟糕

然后我提出了以下基准测试,它显示了为什么在上述问题中首先应该是
std::vector

请参见


hashmaps不是这样工作的。您只对键进行散列,而不是对值进行散列。没有办法访问该值,除非您将该值放在密钥结构中(这将是一种过度杀戮和内存浪费),为什么要这样做?闻起来像是一种味道。用例是什么?你到底想要实现什么?好吧,“你想做什么?”或多或少是清楚的,但为什么它必须是一个
多映射
?您可以使用
std::map
,这样可以吗?任何被比较的键都需要是键的一部分。时期(我知道这是一个疯狂的世界)你想做的是不可能的。你应该告诉我们你为什么需要这样一个结构:你想用它做什么?您希望如何访问元素?插入元素?等等。如果你能给我们结构上的要求,我们可以开始给你建议哪种结构最适合你。这看起来很有趣。引用:“在多集中,元素的值也标识它”。这正是我想要的。谢谢,谢谢!,我也对高性能感兴趣。再次感谢。当编译器优化结束时,我看到的结果是相同的,纯粹的算法性能是由于选择了正确的数据结构。
std::vector< std::pair<int, int> > vec{ {1,2}, {1,-1},{ 2,2 } ,{ -1,1 } };
std::sort(std::begin(vec), std::end(vec));