多映射less_equal导致错误的 find() 结果
multimap less_equal leading to wrong find() results
因此,我决定使用多映射而不是数组,以便我可以将重复值与其他一些值(作为一对)一起存储。所以,当我声明一个多地图时,比如
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 关联容器)
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用 find 解析文件会给出不同文件的奇怪结果
- 有没有办法从map::find()获得提升::可选结果?
- 代码检查 std::unordered_set::find 的结果无法编译
- 多映射less_equal导致错误的 find() 结果
- unordered_multimap-迭代find()的结果会产生具有不同值的元素
- c++ std:: string.Find以布尔表达式返回意外结果
- 如何解析mongoDB c++中find方法返回的结果
- 如何将排序函数应用于字符串.find( ) 以按字母顺序打印结果