重载 operator< 到 (0, 1) = (0, 1) 和 (0, 1) = (1, 0)
Overloading operator< to (0, 1) = (0, 1) and (0, 1) = (1, 0)
如何更改运算符<以使我的逻辑正常工作?
我正在尝试这样,但它不起作用。
struct simpleLink {
int orig;
int dest;
bool operator<(const simpleLink& otherLink) const
{
if(orig == otherLink.orig)
return dest < otherLink.dest;
else if (orig == otherLink.dest)
return dest < otherLink.orig;
else
return orig < otherLink.orig;
}
}
从我的角度来看,它应该可以工作,但事实并非如此...
当我有一组 simpleLink 并且我插入 (0, 1) 然后我尝试插入 (1, 0) 时,它不应该插入
示例:
int main() {
set<simpleLink> test;
simpleLink secureLink;
secureLink.orig = 0;
secureLink.dest = 1;
simpleLink secureLink2;
secureLink2.orig = 1;
secureLink2.dest = 0;
cout << secureLink.orig << " " << secureLink.dest << endl;
cout << secureLink2.orig << " " << secureLink2.dest << endl;
test.insert(secureLink);
test.insert(secureLink2);
cout << "Test Size:" << test.size() << endl;
return 0;
}
输出为:
0 1
1 0
Test Size: 2
集合的大小应为 1。
如果您希望集合中的两个项目进行等价比较,则比较器必须为 (a,b) 或 (b,a) 产生等价性。你的函数不会那样做。
您似乎想忽略比较相等的任何两个并根据不等于排序?
为此,您必须选择如何相对于彼此排序所有原点和目标!
下面的工作是对每个 link 的 orig 和 dest 进行排序,然后比较最小的。只有最小的相等才比较大的
bool operator<(const simpleLink& that) const
{
auto this2 = std::minmax( orig, dest );
auto that2 = std::minmax( that.orig, that.dest );
return (this2.first != that2.first)
? (this2.first < that2.first)
: (this2.second < that2.second);
}
示例:
- (1 2) < (2 2)
- (1 2) < (1 3)
希望对您有所帮助。
如何更改运算符<以使我的逻辑正常工作?
我正在尝试这样,但它不起作用。
struct simpleLink {
int orig;
int dest;
bool operator<(const simpleLink& otherLink) const
{
if(orig == otherLink.orig)
return dest < otherLink.dest;
else if (orig == otherLink.dest)
return dest < otherLink.orig;
else
return orig < otherLink.orig;
}
}
从我的角度来看,它应该可以工作,但事实并非如此...
当我有一组 simpleLink 并且我插入 (0, 1) 然后我尝试插入 (1, 0) 时,它不应该插入
示例:
int main() {
set<simpleLink> test;
simpleLink secureLink;
secureLink.orig = 0;
secureLink.dest = 1;
simpleLink secureLink2;
secureLink2.orig = 1;
secureLink2.dest = 0;
cout << secureLink.orig << " " << secureLink.dest << endl;
cout << secureLink2.orig << " " << secureLink2.dest << endl;
test.insert(secureLink);
test.insert(secureLink2);
cout << "Test Size:" << test.size() << endl;
return 0;
}
输出为:
0 1
1 0
Test Size: 2
集合的大小应为 1。
如果您希望集合中的两个项目进行等价比较,则比较器必须为 (a,b) 或 (b,a) 产生等价性。你的函数不会那样做。
您似乎想忽略比较相等的任何两个并根据不等于排序?
为此,您必须选择如何相对于彼此排序所有原点和目标!
下面的工作是对每个 link 的 orig 和 dest 进行排序,然后比较最小的。只有最小的相等才比较大的
bool operator<(const simpleLink& that) const
{
auto this2 = std::minmax( orig, dest );
auto that2 = std::minmax( that.orig, that.dest );
return (this2.first != that2.first)
? (this2.first < that2.first)
: (this2.second < that2.second);
}
示例:
- (1 2) < (2 2)
- (1 2) < (1 3)
希望对您有所帮助。