std :: any_of是否需要遵循短路逻辑?

Kle*_*rič 29 c++ stl language-lawyer c++11

鉴于以下代码,

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::any_of(std::begin(numbers), std::end(numbers), 
            [](int number) { return number > 3; } );
Run Code Online (Sandbox Code Playgroud)

std :: any_of需要(按标准),一旦达到4就返回?

Sto*_*ica 33

标准本身并没有提出任何这样的硬性要求.但有人可能会推断它是间接鼓励的([alg.any_of]):

template <class InputIterator, class Predicate>
  bool any_of(InputIterator first, InputIterator last, Predicate pred);
template <class ExecutionPolicy, class ForwardIterator, class Predicate>
  bool any_of(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last,
              Predicate pred);
Run Code Online (Sandbox Code Playgroud)

返回:如果[first,last]为空,或者如果在[first,last]范围内没有迭代器i使得pred(*i)为真,则返回false,否则返回true.

复杂性:最多 - 谓词的最后一次应用.

虽然一个完全符合要求的实现可能会准确地 应用谓词last-first,但对我来说,这句话听起来似乎会被鼓励尽快退出.

请注意,几乎不可能要求接受相同的过载ExecutionPolicy.从那以后,评估的顺序是未知的.

在一个不那么正式的说明中,顺序版本的任何实现都不会在谓词为真的情况下退出,这会使其作者的凭据受到质疑.

  • 标准不应该强制确定顺序和计数,因为它可能会排除依赖于容器和谓词类型的优化.例如`any_of(begin(intSet),end(intSet),[](int i){return i> 500 && i <1000;})`可以翻译成涉及`intSet.upper_bound(500);`的东西.或者容器(部分)连续,编译器生成SIMD.或者有一个不同的顺序,可以更有效地访问容器元素.如果谓词没有副作用,那么所有这些都将被授予仍然按照as-if规则工作. (5认同)