【发布时间】: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()放在最后,然后在两个向量上计算这个算法的时间