【问题标题】:Why does std::max return the wrong value? [duplicate]为什么 std::max 返回错误的值? [复制]
【发布时间】:2014-12-22 10:50:09
【问题描述】:

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

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

【问题讨论】:

  • IIRC 对于某些排序参数,在两者相等的情况下返回第二个参数更有意义。
  • @juanchopanza 有趣,你能举个例子吗?谢谢!
  • 这来自(我相信)来自 Alexander Stepanov 的“编程笔记”——其中可能有一个基本原理。
  • @P0W 我找到了these notes from Stepanov。我认为他在“编程元素”中也涵盖了这一点。

标签: c++


【解决方案1】:

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

然而,在实践中,minmax 用于预排序集:在其中您可以有两个排序相同但不完全相同的元素的集合。例如,您可能正在操纵:

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

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

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

  • (min(x,y),max(x,y)) 对是 (x,y) 或 (y,x),

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

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

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

【讨论】:

  • 我认为我们可以有一个函数std::stable_max(以及为了一致性std::stable_min)来解决这种不一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多