Подтвердить что ты не робот

Требуется ли std:: any_of следовать логике короткого замыкания?

Учитывая следующий код,

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

означает, что std:: any_of требуется (по стандарту) для возврата, как только он достигнет 4?

4b9b3361

Ответ 1

Сам стандарт не ставит такого жесткого требования. Но можно сделать вывод, что это косвенно поощряется ([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);

Возвращает: false, если [первый, последний] пуст или нет итератора я в диапазоне [first, last], для которого pred (* i) истинно, и true в противном случае.

Сложность: самое последнее - первые применения предиката.

В то время как совершенно соответствующая реализация может применять предикат точно last-first раз, текст мне звучит так, как будто бы было предложено как можно скорее выйти.

Обратите внимание, что практически невозможно запросить ту же самую перегрузку, которая принимает ExecutionPolicy. С тех пор порядок оценки неизвестен.

В менее формальной заметке любая реализация последовательной версии, которая не выходит из момента, когда предикат является истинным, ставит под сомнение учетные данные его автора.