我正在使用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/