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));