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

Есть что-нибудь вроде "std:: и" или "std:: or"?

Учитывая контейнер с булевыми значениями (пример - std::vector<bool>), существует ли стандартная функция, которая возвращает true, если все значения true ( "и" ) или true, если хотя бы одно значение true ( "или" ), с эвакуацией короткого замыкания?

Сегодня утром я выкопал www.cplusplus.com, но не смог найти ничего близкого.

4b9b3361

Ответ 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

Ответ 2

есть ли стандартная функция, которая возвращает true, если все значения истинны ( "и" )

std::all_of(vec.begin(), vec.end(), [](bool x) { return x; } )

или true, если хотя бы одно значение истинно ( "или" )

std::any_of(vec.begin(), vec.end(), [](bool x) { return x; } )

с эвакуацией короткого замыкания?

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

Ответ 3

Вы можете использовать объекты функций 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.

Ответ 4

Если вам не нужен общий алгоритм для разных типов контейнеров...

Поскольку вы ищете оценку короткого замыкания, вы можете дать шанс 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();