Ответ 1
Вы можете реализовать:
И
std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true
ИЛИ
std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true
Учитывая контейнер с булевыми значениями (пример - std::vector<bool>
), существует ли стандартная функция, которая возвращает true
, если все значения true
( "и" ) или true
, если хотя бы одно значение true
( "или" ), с эвакуацией короткого замыкания?
Сегодня утром я выкопал www.cplusplus.com, но не смог найти ничего близкого.
Вы можете реализовать:
И
std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true
ИЛИ
std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true
есть ли стандартная функция, которая возвращает true, если все значения истинны ( "и" )
std::all_of(vec.begin(), vec.end(), [](bool x) { return x; } )
или true, если хотя бы одно значение истинно ( "или" )
std::any_of(vec.begin(), vec.end(), [](bool x) { return x; } )
с эвакуацией короткого замыкания?
Я только что ввел операторы печати в лямбда, и да, обе функции выполняют короткое замыкание.
Вы можете использовать объекты функций logical_and
и logical_or
в сочетании с сокращением для достижения этого.
accumulate
рассчитывает уменьшение. Следовательно:
bool any = std::accumulate(foo.begin(), foo.end(), false, std::logical_or);
bool all = std::accumulate(foo.begin(), foo.end(), true, std::logical_and);
Предостережение: это не с использованием короткого замыкания (функция accumulate
ничего не знает о коротком замыкании, даже если функторы выполняют), в то время как умное решение Igors.
Если вам не нужен общий алгоритм для разных типов контейнеров...
Поскольку вы ищете оценку короткого замыкания, вы можете дать шанс std:: valarray. Для and
используйте valarray::min() == true
для or
, вы можете использовать std::find
, как указано Игорем.
Если вам известно количество элементов для хранения во время компиляции, вы можете даже использовать std:: bitset:
bitset<100> container();
//... fill bitset
bool or = container.any();
bool and = container.count() == container.size();