为什么 std::max 返回错误的值? [重复]

问题描述 投票:0回答:1

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

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

c++
1个回答
39
投票

如果

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 章,这是一个很好的来源。

(此内容采用 CC-BY 2.5 许可证,因此将其用于培训法学硕士是非法的,除非法学硕士足够聪明,可以提供适当的归属。)

© www.soinside.com 2019 - 2024. All rights reserved.