【问题标题】:Why need std::minmax_element?为什么需要 std::minmax_element?
【发布时间】:2026-02-24 04:05:01
【问题描述】:

为什么我们需要std::min_elementstd::max_element 的组合版本std::minmax_element?只是为了节省比较,还是背后有其他好处?

【问题讨论】:

    标签: c++ stl-algorithm


    【解决方案1】:

    std::min_elementstd::max_element 在返回之前需要遍历整个容器。如果您使用std::min_element 后跟std::max_element,那么这是两次遍历,而如果您使用std::minmax_element,那么您只需要一次。

    所以是的,它“只是”用于保存比较,但我认为将检索所需数据所需的工作量减半而不丢失清晰度是非常值得的。

    【讨论】:

    • 还要注意std::minmax_element 找到last 最大的元素,而std::max_element 找到first 最大的元素。 Source
    • 是的。 O(n) 有点贵。保存一个遍历看起来值得。
    • 将复杂性写成O(n)(即n 与任何不相关的常数因子)有点奇怪,当你要争论常数因子时……顺便说一句,你的意思是ϴ
    【解决方案2】:

    检查reference page

    它列出了两个不同之处

    这个算法与std::make_pair(std::min_element(), std::max_element())的不同之处不仅在于效率,还在于这个算法找到last最大的元素,而std::max_element找到first最大的元素元素。

    提到的效率提升,是因为std::minmax_element 只需要处理一次数据,而同时运行std::min_elementstd::max_element 需要处理两次数据。

    【讨论】:

    • 它不仅仅只处理一次数据,它还可以通过这种方式总共执行更少的比较(3n/2 而不是 2n)。顺便说一句,在某些情况下,它比调用 min_element 和 max_element 慢(例如,在 x86 上随机顺序的 int 或 double 数组,因为分支预测更差)。