为什么std :: max返回错误的值?

时间:2014-10-27 09:30:09

标签: c++

在" Grill the Committee"来自CppCon 2014的会议,委员会成员Walter Brown提到std :: max在两个参数具有相等值的情况下返回错误的值。

这是被接受的,没有评论,也没有详细说明。这是什么意思?为什么要返回哪个值很重要?

1 个答案:

答案 0 :(得分:36)

如果minmax仅用于有序集,则所有合理的定义都是等效的。

但实际上,minmax用于预先排序的集合:在这些集合中,您可以使用两个不同的元素进行排序。例如,您可能正在操纵:

struct student {
    char *name;
    int grade;
};

并在s1 < s2时定义strcmp(s1->name, s2->name) < 0。然后,两名同名但成绩不同的学生将进行相同的排序。对于(预)排序关系,这两个元素被称为等价

在预先设定的集合中,参数为:min两个等效元素应返回第一个参数,max应返回第二个参数。此定义保留了您期望的一些属性,最值得注意的是

  • 该对(min(x,y)max(x,y))是(xy)或(yx),

  • 如果xy不同,则min(x,y)max(x,y)不同,

  • 将(xy)映射到(min(x,y)max(x,y))的函数是两个元素集的稳定排序函数。

这不是一个新想法,你会在编程的许多标准文本中找到比我更好的解释。如果您喜欢C ++语法,Mat和juanchopanza已经引用的Stepanov Papers的第7章是一个很好的来源。