在" Grill the Committee"来自CppCon 2014的会议,委员会成员Walter Brown提到std :: max在两个参数具有相等值的情况下返回错误的值。
这是被接受的,没有评论,也没有详细说明。这是什么意思?为什么要返回哪个值很重要?
答案 0 :(得分:36)
如果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)
)的函数是两个元素集的稳定排序函数。这不是一个新想法,你会在编程的许多标准文本中找到比我更好的解释。如果您喜欢C ++语法,Mat和juanchopanza已经引用的Stepanov Papers的第7章是一个很好的来源。