在 CppCon 2014 的“Grill the Commission”会议中,委员会成员 Walter Brown 提到,在两个参数具有相等值的情况下,std::max 返回错误值。
这被接受,没有评论,也没有详细说明。他这话是什么意思?为什么返回哪个值很重要?
如果
min
和 max
仅用于有序集,则所有合理的定义都是等效的。
然而,在实践中,
min
和 max
用于预排序集:其中可以有两个排序相同但不相同的元素。例如,您可以操纵:
struct student {
char *name;
int grade;
};
并在
s1 < s2
时定义 strcmp(s1->name, s2->name) < 0
。那么两个名字相同但成绩不同的学生就会得到相同的排序。对于(预)排序关系,这两个元素被称为“等价”。
在预先排序的集合上,参数为,两个等效元素的 min
应返回第一个参数,而
max
应返回第二个参数。这个定义保留了您期望的一些属性,最值得注意的是
该对 (min(x,y)
max(x,y)
) 是 (x
,y
) 或 (y
,x
),
如果
x
y
不同,则 min(x,y)
和 max(x,y)
不同,
将 (
x
y
) 映射到 (min(x,y)
, max(x,y)
) 的函数是两个元素集合的稳定排序函数。