std::max_element() 有多聪明?

Posted

技术标签:

【中文标题】std::max_element() 有多聪明?【英文标题】:How smart is std::max_element()? 【发布时间】:2020-05-09 16:04:49 【问题描述】:

假设我有一个std::vector<int>:

std::vector<int> v;
[v is initialized]

我想得到v 的最大元素。有一种算法可以做到这一点:

int max_value = *std::max_element(v.begin(), v.end());

到目前为止,一切都很好。

现在,假设 v 包含 10,000,000 个元素,它的第 10 个元素等于 std::numeric_limits&lt;int&gt;::max()std::max_element() 是否会(不必要地)检查 v 的最后 9,999,990 个元素,还是会认识到不能有大于 std::numeric_limits&lt;int&gt;::max() 的元素,从而在第 10 个元素之后停止?

【问题讨论】:

我怀疑标准对此有何规定,但一个好的实现可以做到这一点。 我会说“它有多聪明”是实施质量问题。它可以是聪明的,也可以是愚蠢的,但只要它满足合同,你就无法知道。 这不是明智之举。这样的优化很难以零成本完成,这是针对罕见且非典型用例的优化。 制作一个100元素的向量,把numeric_limits&lt;int&gt;::max()放在最后,然后在两个向量上计算这个算法的时间 【参考方案1】:

我不能代表所有的实现,但是 libc++ 的max_element 实现并没有做到这一点。

这个想法有几个问题:

假设序列元素的类型存在numeric_limits 的特化。 (max_element 适用于任何可以订购的东西。)这可以通过一些模板元编程来解决。 有一个版本的max_element 接受比较谓词,而不仅仅是operator &lt;。这种情况下的最大值是多少? 这将要求序列中的类型是“平等可比的”,而不仅仅是“不可比”。 (可能是最重要的)这将在循环中引入一个枚举序列元素的测试,从而降低其他所有人的算法速度。

【讨论】:

以上是关于std::max_element() 有多聪明?的主要内容,如果未能解决你的问题,请参考以下文章

在二维矩阵上使用 std::max_element

std::max_element

在 vector<double> 上使用 std::max_element

SSE 优化(行重新排序、操作整理)中的编译器(例如 g++)有多聪明

在最小化冗余方面,像 MySQL 和 H2 这样的数据库有多聪明?

Vector求最大值最小值