【问题标题】:Difference in behaviour of max_element and minmax_element in C++ STLC++ STL 中 max_element 和 minmax_element 的行为差异
【发布时间】:2017-07-29 19:15:00
【问题描述】:

在 C++max_element 中,如果有多个元素为最大值,则返回第一个这样的元素。而minmax_element(C++11 以上)返回最后一个最大元素。

这种行为的标准是否有原因?

来自 cplusplus.com

如果多个等效元素具有最大值,则第二个迭代器指向此类元素中的最后一个。

第一个版本使用 operator

【问题讨论】:

  • According to CPPReference this is the expected behaviour. 为什么这是意料之中的事,我必须去参加标准比赛。
  • [alg.min.max](rev n4594 中的注释 30)规定这是法律。没有理性列出。
  • 更有趣的是minmax_element对最小元素应用了相反的策略(返回第一个)。
  • Boost 库文档boost.org/doc/libs/1_57_0/libs/algorithm/minmax/#rationale 包含一些基本原理讨论。
  • @Barmar 这是一个很好的链接。它在一定程度上解释了该决定的理由。我现在必须通过 CLRS 第 9.1 节来完全理解算法的背景,该算法实现了最小最大元素搜索的 3n/2 解决方案。如果您将其添加为答案,我会接受。如果您可以添加算法的详细信息会更好,但这对我来说并不重要。

标签: c++ c++11 stl c++14


【解决方案1】:

Boost 的库文档包括 rationale

当尝试使用 (Cormen, Leiserson, Rivest: "Introduction to Algorithms", 第 9.1 节) 中提出的程序来设计 minmax_element 时,定义问题就会浮出水面。如果 [first,last) 有 n 个元素,则应该可以仅使用 3n/2 次比较推导出算法,但如果尝试编写一个名为 first_min_first_max_element() 的函数,该函数在 a 中返回 std::min_element 和 std::max_element对,简单的实现不起作用。这个问题,相当巧妙地,是关于相等的元素:我不得不考虑一段时间才能找到一种方法,每对只执行三个比较并返回第一个 min 和第一个 max 元素。长期以来,在最坏的情况下,似乎任何这样做的尝试都会消耗每对四次比较。这个实现实现了三个。

不可能(甚至不希望)改变 max_element 的含义,但提供一个名为 minmax_element 的函数仍然是有益的,它返回一对 min_element 和 max_element。尽管调用 min_element 和 max_element 很容易,但这会执行 2(n-1) 次比较,并且需要对输入进行两次传递。相反, minmax_element 将执行较少的比较并在输入上执行单次传递。当迭代器类型不是原始指针,甚至只是 InputIterator 概念的一个模型时(尽管在这种情况下必须更改接口,因为无法复制返回类型,因此可以例如返回一个值)。

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2017-02-18
    相关资源
    最近更新 更多