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”
似乎对我有同样的结果。
答案 0 :(得分:151)
std::max(a, b)
在两者相等时返回a
。
Stepanov和其他人认为这是错误的,因为它打破了a
和b
给出的有用属性,您始终可以使用{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]。
特别是,如果a
和b
相同,则a < b
和b < 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