You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::set插入新元素判定逻辑疑问:自定义类场景异常解析

问题原因解析

std::set 判断元素是否重复时,完全不会调用你重载的operator==,它的判断逻辑基于自身的比较器(默认是std::less,即依赖operator<;如果指定了其他比较器则用对应的规则):当两个元素x和y满足 !(comp(x,y)) && !(comp(y,x)) 时,就会被判定为等价元素,新元素不会被插入。

看你的代码,重载的operator>实现是比较成员a的大小(返回this->a < other.a)——假设你的std::set<A>用的是std::greater作为比较器(因为你重载了operator>),那么当两个对象的a值相同时,x > y和y > x都会返回false,此时set会直接判定这两个对象等价,哪怕它们的b值完全不同,也会拒绝插入新对象。

总结一下:你给set设定的比较逻辑只关注a的值,所以只要a相同,set就会认定是同一个元素,这和你写的operator==以及b的值没有任何关系。

内容的提问来源于stack exchange,提问作者Mastiff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:55:13