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
может быть более эффективным.