为什么要使用“b<一个 ? a:b“而不是”a< b? b:“实现最大模板?

时间:2018-06-13 09:46:40

标签: c++ templates

C++ Templates - The Complete Guide, 2nd Edition介绍了max模板:

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&lt;一个 ? a:b“而不是”a&lt; b? b:“到   确保即使两个值都是正确的,函数也能正常运行   相当但不相等。

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

3 个答案:

答案 0 :(得分:151)

确实指定

std::max(a, b)在两者相等时返回a

Stepanov和其他人认为这是错误的,因为它打破了ab给出的有用属性,您始终可以使用{min(a, b), max(a, b)}对它们进行排序;为此,当参数相同时,您希望max(a, b)返回b

答案 1 :(得分:63)

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

有关上下文解释,请参阅@T.C.'s answer

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

template<class T> constexpr 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,因此{{1}右侧的值将在条件运算符中返回,因此:必须在右侧,所以:

a

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

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

答案 2 :(得分:21)

关键是当它们相同时应归还哪一个; std::max必须为此案件返回import itertools as it list1 = [ {'currency': 'USD', 'value': 10}, {'currency': 'USD', 'value': 12}, {'currency': 'EUR', 'value': 11}, {'currency': 'EUR', 'value': 15}, {'currency': 'EUR', 'value': 17}, {'currency': 'GBP', 'value': 13}, ] kfunc = lambda x: x['currency'] groups = it.groupby(sorted(list1, key=kfunc), kfunc) result = [{'currency':k, 'value':sum(x['value'] for x in g)} for k, g in groups] print(result) (即第一个参数)。

  

如果它们是等效的,则返回a

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

(正如@Holt所说,引用似乎相反。)

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

e.g。

b