如何解决当比较对象始终返回 true 或 false 时,标准容器的预期行为
当自定义比较对象总是返回相同的结果(可能是真或假,但始终相同),同时将元素放在标准库容器中时,预期行为是什么,比如 std::set
或 {{ 1}}。例如
std::map
然后像创建对象
struct A{
int i_mem;
double d_mem;
};
bool operator > (const A& first,const A& second)
{
//This is hard coded just for the sake of example and actual code Could still return always return the same value due to bug in the logic.
return false;
}
在这种情况下,当使用 g++-10 测试时,集合只有第一个元素 set<A,greater<A>> mset{{5,434.5},{1,32.4},{3,29.3}};
。
解决方法
如果比较器总是返回 false,那么 a < b || b < a
总是 false
,所以 std::set
会将所有元素视为相等并且只包含一个元素。
如果比较器始终返回 true,则 a < b && b < a
始终为 true
,这毫无意义并违反了 strict weak ordering,从而导致未定义的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。