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
相关产品推荐
相关产品推荐

