微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当比较对象始终返回 true 或 false 时,标准容器的预期行为

如何解决当比较对象始终返回 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 举报,一经查实,本站将立刻删除。