multimap less_equal导致错误的find()结果

时间:2014-02-14 17:18:50

标签: c++

因此,我决定使用多重映射而不是数组,以便我可以存储重复值以及其他一些值(作为一对)。 所以,当我宣布像

这样的多地图时
multimap<int,int,less_equal<int> > M;
multimap<int,int,less_equal<int> >::iterator it,it2;

然后将所有元素插入其中,比如说

(10,1), (2,2), (8,3), (2,2), (8,1)

然后通过它迭代,我得到了我想要的东西:

2 2 
2 2
8 1 
8 3 
10 1

但是现在,find函数不起作用 比如,如果我想找一个号码,请说

it2=M.find(temp);

其中temp是多图中存在的某个值,比如说8,它只是忽略它并且找不到它!当我没有包含less_equal时,find函数正在工作,但由于这是我想要的程序,现在我正在努力处理我的代码。有人可以建议补救吗?以及find无法正常工作的原因?

3 个答案:

答案 0 :(得分:1)

关联容器的比较器必须对密钥类型产生严格的弱排序。 std::less_equal不是严格的弱序。特别是,它并不严格,因为某些x <= x x(事实上,对于所有x)。相反,您应该使用std::less

答案 1 :(得分:1)

比较器必须定义严格排序;也就是说,在比较两个等价值时,它必须返回false。否则,依赖于此的逻辑将失败。特别是,find(temp)查找等同于temp的密钥,满足

!compare(key,temp) && !compare(temp,key)

除非排序严格,否则不会发生。

less(默认比较器)是严格的; less_equal不是,所以不能使用。

答案 2 :(得分:0)

你需要一个更少(不等于)的比较器。

如果符合以下条件,则两个键是等效的:

  

即,如果用于,则认为两个键k1和k2是等效的   比较对象comp,comp(k1,k2)== false&amp;&amp; comp(k2,k1)==   假的。

(来自23.2.4关联容器)