【发布时间】:2020-12-26 16:39:48
【问题描述】:
我正在使用 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 only if e1.a == e2.b && e1.b == e2.c && e1.c == e2.a?
【问题讨论】:
-
Some reading,特别是严格的弱排序以及
equiv是如何定义的。 -
因为
std::set是一个有序容器,它需要知道元素之间的相对顺序,而不仅仅是两个元素相等? (请注意,<也可用于检查是否相等。) -
我们刚刚获得了 C++20,我们将获得
operator<=>。这可以做所有的比较。 -
如果你有
operator ==那么它对标准容器无效,因为标准容器期望如果 A==B 那么 B==A