多映射less_equal导致错误的 find() 结果

multimap less_equal leading to wrong find() results

本文关键字:find 结果 错误 less 映射 equal      更新时间:2023-10-16

因此,我决定使用多映射而不是数组,以便我可以将重复值与其他一些值(作为一对)一起存储。所以,当我声明一个多地图时,比如

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

但是现在,查找功能不起作用比如,如果我想找到一个数字,说

it2=M.find(temp);

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

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

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

除非订购严格,否则不会发生这种情况。

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

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

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

在以下情况下,两个键是等效的:

也就是说,两个键 k1 和 k2 被认为是等效的,如果对于 比较对象 comp, comp(k1, k2) == false && comp(k2, k1) == 假。

(来自 23.2.4 关联容器)