any_of Versus find_if

С++ 11 ввел any_of algorithm s.

Кажется, это работает точно так же, как find_if.

Скажем, у меня есть функтор: function<bool(int)> foo; И массив: vector<int> bar;

Кажется, что эти два вызова делают то же самое:

any_of(bar.begin(), bar.end(), foo);

а также

bar.end() != find_if(bar.begin(), bar.end(), foo);

Я также чувствую, что all_of, и none_of может быть достигнуто путем отрицания инструкции find_if.

Являются ли эти алгоритмы только здесь, чтобы сделать сравнение, чтобы положить end для нас, или есть польза, я не понимаю?

Ответ 1

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

Предложение добавить их в стандарт (N2666) гласит:

Эти три алгоритма обеспечивают обычные математические операции ∀, ∃ и ∄: заданы диапазон и предикат, определяют, является ли этот предикат истинным для всех элементов; существует ли элемент, для которого предикат является истинным; или нет элементов, для которых предикат является истинным. Строго говоря, нет необходимости предоставлять все три из этих алгоритмов (!none_of и any_of эквивалентны), но все три из этих операций имеют одинаковое значение.

Названия более естественны и легче читать (конечно, для неспециалистов C++), чем выражение, включающее find_if и (in) равенство.

Стандартная библиотека GCC реализует их путем простого вызова других функций:

all_of(first, last, pred) - return last == std::find_if_not(first, last, pred);

none_of(first, last, pred) return last == std::find_if(first, last, pred);

any_of(first, last, pred) - return !none_of(first, last, pred);

Ответ 2

Обратите внимание на тип возврата двух алгоритмов. Точно так же, как binary_search возвращает только, если предоставленный элемент можно найти в отсортированной последовательности, а lower_bound возвращает итератор в первый элемент, не меньший, чем предоставленный элемент, any_of и find_if дополняют друг друга. Обратите внимание, что binary_search (почти) совпадает с !(val < lower_bound(a.begin(), a.end(), val))

any_of будет только сказать вам, если предикат выполняется для любого элемента, в то время как find_if возвращает итератор на элемент, который делает предикат станет истинным. Также обратите внимание, что find_if гарантирует, что итератор первого элемента, делающий предикат станет истинным, будет возвращен, а any_of не будет иметь таких ограничений. Таким образом, в теории в некоторых случаях any_of может быть более эффективным.