关于STL中的pair运算符重载的问题,请大家指点!谢谢
在看侯捷的《C++标准程序库》,看到了第4.1节,有个问题问大家:
书中的pair的“<”运算符重载代码如下:
- C/C++ code
template<typename T1, typename T2> bool operator<(const pair<T1, T2> &lhs, const pair<T1, T2> &rhs) { return lhs.first < rhs.first || (!(rhs.first < lhs.first) && lhs.second < rhs.second); }看了上面的偌,我理解的pair的小于运算的含义是“两个pair类型的first和second只要有一个小于就可以”也就是说lhs的first小于rhs的first小于号就成立,或者rhs的second小于lhs的second就成立。如果是这样的话,那么第三行代码中的“!(rhs.first < lhs.first)”就是多余的?
谢谢各位
[解决办法]
要么是left.first < right.first, 要么是left.first==right.first && left.second < right.second。
这可不是多余的, 因为STL规定必须实现<比较符(该操作符必须保证如果两个变量相等的时候必须返回false).
整个的意思是: 如果左边第一个小于右边第一个, 或者左边第一个等于右边第一个且左边第二个小于右边第二个,那么左边小于右边。
|| 之后&&之前的是说右边第一小于左边第一不成立,其实就是说右边>=左边,而且||之前说明左边>=右边,唯一的可能就是左边=右边。
[解决办法]
你理解得太离谱地错误了。
不是或的关系啊。
根据代码来重新理解,代码没有错误。
[解决办法]
是多余的
如果lhs.first < rhs.first 成立,则返回true,否则 !(rhs.first < lhs.first)一定成立,此时返回lhs.second < rhs.second
c++并没有规定当两者相等时(何况相等是你定义的)小于操作符就得返回false。当然这么做会引起一些问题,比如set容器不能正常使用。
如果你贴的代码没错的话,这个小于关系就不是全序的
比如(3,4)和(4,3)相比,(3,4)<(4,3),(4,3)<(3,4)同时成立