首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么使用“b<a”?A:B而不是a<b?B:A:“要实现max模板吗?”

为什么使用“b<a”?A:B而不是a<b?B:A:“要实现max模板吗?”
EN

Stack Overflow用户
提问于 2018-06-13 09:46:39
回答 3查看 13.3K关注 0票数 158

C++模板-完整指南,第2版引入了最大值模板:

代码语言:javascript
运行
复制
template<typename T>
T max (T a, T b)
{
  // if b < a then yield a else yield b
  return  b < a ? a : b;
}

并解释了如何使用“b < a ? a : b”而不是“a < b ? b : a”

注意,根据StepanovNotes的max()模板有意返回“b

如何理解"even if the two values are equivalent but not equal."?“a < b ? b : a”似乎对我也有同样的结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-13 11:15:27

实际上,指定std::max(a, b)返回a时两者是等价的。

斯捷潘诺夫和其他人认为这是一个错误,因为它破坏了给定ab的有用属性,因此可以使用{min(a, b), max(a, b)}对它们进行排序;为此,当参数相等时,希望max(a, b)返回b

票数 154
EN

Stack Overflow用户

发布于 2018-06-13 10:05:52

这个答案解释了为什么从C++标准的角度来看,给定的代码是错误的,但它是脱离上下文的。

有关上下文的解释,请参见@T.C.的答案

该标准将std::max(a, b)定义为以下[alg.min.max] (重点是我的):

模板const T& max(const T& a,const T& b); 要求:T类型为LessThanComparable (表18)。 返回:较大的值。 备注:当参数等效时,返回第一个参数.

这里等价的意思是!(a < b) && !(b < a)true [alg.sorting#7]

特别是,如果ab是等价的,那么a < bb < a都是false,因此:右侧的值将在条件运算符中返回,因此a必须位于右侧,因此:

代码语言:javascript
运行
复制
a < b ? b : a

...seems是正确的答案。这是libstdc++libc++使用的版本。

因此,根据当前的标准,报价中的信息似乎是错误的,但是定义它的上下文可能是不同的。

票数 62
EN

Stack Overflow用户

发布于 2018-06-13 09:50:39

关键是当它们等价时应该返回哪一个;对于这种情况,std::max必须返回a (即第一个参数)。

如果它们相等,则返回a

因此,应该使用a < b ? b : a;另一方面,b < a ? a : b;将错误地返回b

(正如@Holt所说,这句话似乎正好相反。)

“这两个值是等价的,但不相等”意味着它们在被比较时具有相同的值,但它们在其他方面可能是不同的对象。

例如:

代码语言:javascript
运行
复制
struct X { int a; int b; };
bool operator< (X lhs, X rhs) { return lhs.a < rhs.a; }
X x1 {0, 1};
X x2 {0, 2};
auto x3 = std::max(x1, x2); // it's guaranteed that an X which cantains {0, 1} is returned
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50834117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档