И std :: all_of (), и std: none_of () возвращают true для пустых контейнеров.
Помимо обсуждения концептуального аспекта, может ли кто-то предложить идиому, которая не требует постоянной проверки, является ли контейнер пустым, И проверки на all_of или none_of?
Это беспокоит то, что использование одного и того же предиката в обоих алгоритмах в пустом контейнере будет указывать, что предикат верен как для ВСЕХ, так и для НЕТ элементов. Итак, ваш (пустой) вектор: all_of «нечетный», all_of «четный», none_of «нечетный» и none_of «четный».
На более практическом уровне я имею в виду проверку набора элементов на состояние, как и любого «готового к обработке», и ожидаю, что пустая коллекция будет соответствовать «НЕТ, нет элементов, готовых для обработки». Я знаю, что могу проверить, пусто ли это отдельно, но я ищу другие возможности.
Вы можете написать свою собственную оболочку и использовать ее для изменения результата, если контейнер пуст:
// in your namespace, not std:
template< class InputIt, class UnaryPredicate >
bool none_of( InputIt first, InputIt last, UnaryPredicate p )
{
return first != last && std::none_of( first, last, p );
}
На более практическом уровне я имею в виду проверку набора элементов на состояние, как и любого «готового к обработке», и ожидаю, что пустая коллекция будет соответствовать «НЕТ, нет элементов, готовых для обработки».
Вот почему std::any_of()
возвращается false
для пустой коллекции.
Если бы вопрос был «Есть все элементы закончили обработку? «, тогда ожидаемый ответ был бы» Да, все закончено. «, если бы не было никаких элементов, которые должны быть обработаны в первую очередь (это std::all_of()
дело).
Аналогичным образом, вопрос «Не было ли ошибок при обработке?» ответили бы: «Да, ошибок не было». для пустого списка (без работы -> без ошибок). Это то, что std::none_of()
проверяет на.