STL中的pair类的运算符“<”重载看不懂,请各位指点下,谢谢!

紫色动力 2011-08-11 10:22:47

template<class T1, class T2>
bool operator<(const pair<T1, T2> &x, const pair<T1, T2> &y)
{
return x.first < y.first || (!(y.first < x.first) && x.second < y.second);
}


其中对于“return”一句我有疑问:根据短路规则,当“||”操作符的第一部分“x.first < y.first”成立时,不用计算“return”语句的后部分,返回“true”。当“x.first < y.first”不成立时,才计算“||”操作符的后半部分。“x.first < y.first”不成立的意思就是“x.first >= y.first”。“||”操作符的后半部分语句中的“!(y.first < x.first)”为何不直接写成“x.first == y.first”呢?求解,谢谢各位!!
...全文
326 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫色动力 2011-08-12
  • 打赏
  • 举报
回复
是不是这位啊?
紫色动力 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kevin_perkins 的回复:]

直接写成x.first == y.first也没有意义,如果相等,不会到这部判断。
x.first < y.first成立的情况下,y.first < x.first一定不成立,!(y.first < x.first)一定为真。
保证pair的key条件成立的条件下,再判断value。
[/Quote]
我觉得你说得不对。
用反正法。
假设“x.first == y.first“,那“x.first < y.first”不成立,对吧。所以执行“||”运算符的后半部分。则先执行“!(y.first < x.first)”,这个是为真的。再执行“x.second < y.second”。
即有两种情况会使重载的“<”成立。1是x.first < y.first或者 x.first == y.first 并且 x.second < y.second.
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]

因为first不一定重载了!=运算符
[/Quote]
膜拜 鄙视自己
Kevin_Perkins 2011-08-11
  • 打赏
  • 举报
回复
直接写成x.first == y.first也没有意义,如果相等,不会到这部判断。
x.first < y.first成立的情况下,y.first < x.first一定不成立,!(y.first < x.first)一定为真。
保证pair的key条件成立的条件下,再判断value。
紫色动力 2011-08-11
  • 打赏
  • 举报
回复
我想了下,感觉应该是不一定重载了“==”运算符吧
紫色动力 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]

因为first不一定重载了!=运算符
[/Quote]
就是这句话啊,现在明白了,呵呵!!谢谢啦
liutengfeigo 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]

因为first不一定重载了!=运算符
[/Quote]
膜拜,泪流满面啊,看了帖子我也觉得我奇怪呢,
谢谢....
膜拜一下陶大妈
taodm 2011-08-11
  • 打赏
  • 举报
回复
因为first不一定重载了!=运算符
  • 打赏
  • 举报
回复
少看了一个 “!”吧

64,642

社区成员

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

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