[英]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)的等效项。 您的函数不执行该操作。
您似乎想忽略比较不平等和根据不平等进行排序的任何两个?
为此,您必须选择如何相对于所有orig和dest进行订购!
下面的工作方式是为每个链接对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);
}
例子:
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.