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<int>::max()
。 std::max_element()
是否会(不必要地)检查 v
的最后 9,999,990 个元素,还是会认识到不能有大于 std::numeric_limits<int>::max()
的元素,从而在第 10 个元素之后停止?
【问题讨论】:
我怀疑标准对此有何规定,但一个好的实现可以做到这一点。 我会说“它有多聪明”是实施质量问题。它可以是聪明的,也可以是愚蠢的,但只要它满足合同,你就无法知道。 这不是明智之举。这样的优化很难以零成本完成,这是针对罕见且非典型用例的优化。 制作一个100元素的向量,把numeric_limits<int>::max()
放在最后,然后在两个向量上计算这个算法的时间
【参考方案1】:
我不能代表所有的实现,但是 libc++ 的max_element
实现并没有做到这一点。
这个想法有几个问题:
假设序列元素的类型存在numeric_limits
的特化。 (max_element
适用于任何可以订购的东西。)这可以通过一些模板元编程来解决。
有一个版本的max_element
接受比较谓词,而不仅仅是operator <
。这种情况下的最大值是多少?
这将要求序列中的类型是“平等可比的”,而不仅仅是“不可比”。
(可能是最重要的)这将在循环中引入一个枚举序列元素的测试,从而降低其他所有人的算法速度。
【讨论】:
以上是关于std::max_element() 有多聪明?的主要内容,如果未能解决你的问题,请参考以下文章
在 vector<double> 上使用 std::max_element
SSE 优化(行重新排序、操作整理)中的编译器(例如 g++)有多聪明