关于STL中的pair运算符重载的问题,请大家指点!谢谢

紫色动力 2012-10-25 10:52:34
在看侯捷的《C++标准程序库》,看到了第4.1节,有个问题问大家:
书中的pair的“<”运算符重载代码如下:

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)”就是多余的?


谢谢各位
...全文
1241 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫色动力 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

是多余的
如果lhs.first < rhs.first 成立,则返回true,否则 !(rhs.first < lhs.first)一定成立,此时返回lhs.second < rhs.second

c++并没有规定当两者相等时(何况相等是你定义的)小于操作符就得返回false。当然这么做会引起一些问题,比如set容器不能正常使用。

如果你贴的代码没错的话,这个小于关系就不是全序的……
[/Quote]
我觉得1楼说得对。
STL规定必须实现“<”比较符,第三行的后半部分的意思是在lhs与rhs的first相等的情况下,看lhs是否小于rhs的first。
关于你说的全序问题,我觉得在这不合适。因为pair的小于问题是人为定义的。谢谢各位了,呵呵
Prairial_0 2012-10-26
  • 打赏
  • 举报
回复
是多余的
如果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)同时成立
taodm 2012-10-25
  • 打赏
  • 举报
回复
你理解得太离谱地错误了。
不是或的关系啊。
根据代码来重新理解,代码没有错误。
qq120848369 2012-10-25
  • 打赏
  • 举报
回复
要么是left.first < right.first, 要么是left.first==right.first && left.second < right.second。


这可不是多余的, 因为STL规定必须实现<比较符(该操作符必须保证如果两个变量相等的时候必须返回false).

整个的意思是: 如果左边第一个小于右边第一个, 或者左边第一个等于右边第一个且左边第二个小于右边第二个,那么左边小于右边。

|| 之后&&之前的是说右边第一小于左边第一不成立,其实就是说右边>=左边,而且||之前说明左边>=右边,唯一的可能就是左边=右边。

65,197

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧