给定一个布尔值的容器(例如std::vector<bool>
),如果所有值都是true
(“和”)或{{},是否有标准函数返回true
1}}如果至少有一个值是true
(“或”),那么短路评估会是什么?
我今天早上挖了www.cplusplus.com但是找不到任何东西。
答案 0 :(得分:43)
是否有标准函数,如果所有值都为真(“和”)
,则返回true
std::all_of(vec.begin(), vec.end(), [](bool x) { return x; } )
如果至少有一个值为真(“或”),则为或为true
std::any_of(vec.begin(), vec.end(), [](bool x) { return x; } )
短路评估?
我刚将print语句插入lambda,是的,两个函数都执行短路。
答案 1 :(得分:37)
您可以通过以下方式实施:
并强>
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 :(得分:10)
您可以将功能对象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
函数即使编码器也不知道短路,而Igor的聪明解决方案是。
答案 3 :(得分:1)
如果您不需要针对不同容器类型的通用算法......
在寻找短路评估时,您可以给std :: valarray一个机会。对and
使用valarray::min() == true
or
,您可以使用Igor提到的std::find
。
如果您知道在编译时要存储的元素数量,您甚至可以使用std :: bitset:
bitset<100> container();
//... fill bitset
bool or = container.any();
bool and = container.count() == container.size();