c++ - 为什么对于包含自定义对象的STL集而不是operator ==,operator <重载是必要的

标签 c++ c++11 stl set

我正在使用C++ 11,我想使用set存储我的自定义对象,因为我需要一个容器,该容器可以过滤具有相同值的元素。
这是我的自定义对象的类:

struct Ele
{
    int a, b, c;
}
据我了解,我需要重载operator==函数,因为set需要过滤具有相同值的元素。
但是,阅读此链接:How do i insert objects into STL set之后,似乎需要重载operator<而不是operator==
所以我这样编码:
struct Ele {
    int a, b, c;
    friend bool operator<(const Ele &e1, const Ele &e2);
};
bool operator<(const Ele &e1, const Ele &e2)
{
    if (e1.a < e2.a) {
        return true;
    }
    if (e1.a == e2.a) {
        if (e1.b < e2.b) {
            return true;
        }
        if (e1.b == e2.b) {
            if (e1.c < e2.c) {
                return true;
            }
            return false;
        }
        return false;
    }
    return false;
}
并进行如下测试:
set<Ele> myset;
Ele e1;
e1.a = 1;
e1.b = 2;
e1.c = 3;
Ele e2;
e2.a = 1;
e2.b = 2;
e2.c = 3;
myset.insert(e1);
myset.insert(e2);
cout << myset.size() << endl;
好的,输出是1而不是2,这意味着e2的插入按预期失败,因为e2的值与e1的值相同。
现在我很困惑。
据我了解,operator<只是告诉编译器如何理解e1 < e2,编译器如何知道如何理解e1 == e2?如果我想设置这样的规则怎么办:仅当e1 == e2时才是e1.a == e2.b && e1.b == e2.c && e1.c == e2.a

最佳答案

==本身不足以定义顺序,而<不足。此外,所有其他关系运算符都可以使用operator<强制转换,只要允许您对结果求反即可。
例如,如果是a == b!(a < b),则为!(b < a)<是自然选择,因为按事物的升序思考是自然的。可以选择>,但它并非那么易于处理。

关于c++ - 为什么对于包含自定义对象的STL集而不是operator ==,operator <重载是必要的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63791447/

相关文章:

c++ - volatile 限定符是否取消了此内存的缓存?

c++ - std::find 中的 Lambda 问题

c++ - ostream operator<< 为采用 STL 容器而重载,传递 std::string 会破坏它吗?

c++ - 在 std::list 中就地创建自定义类型对象

c++ - 检查 istreambuf_iterator 失败

c++ - 在 C++ 中定义类和指针

c++ - 何时使用 std::async 与 std::threads?

c++ - 在 std::unordered_map 中查找对应于相同值的所有键

c++ - 读取字符串 vector 时出现超出范围的运行时错误

c++ - 在 C++ 中快速拆分 dynamic_bitset