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