重载运算符< to (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和i插入(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
如果您希望集合中的两个项进行等价比较,比较器必须产生(a,b)或(b,a)的等价。你的函数不这样做。
您似乎想忽略比较相等的任意两个,并根据不相等进行排序?
为此,您必须选择如何对所有原点和dest进行相对排序!
下面的工作方式是对每个链接的origin和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) <(3)
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 如何为运算符<<
- Qt过载数据流运算符<<
- 我可以使用define调用运算符<<
- 运算符<<(ostream&os,..)用于模板类
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- Can运算符<<用于设计我们自己的输出显示方式