27

给定一个布尔值容器(一个例子是),如果所有值都是(“and”)或者如果至少一个值是(“or”) std::vector<bool>,是否有一个标准函数返回短路评估?truetruetruetrue

我今天早上在www.cplusplus.com 上进行了挖掘,但找不到任何接近的东西。

4

4 回答 4

52

如果所有值都为真(“和”),是否有一个标准函数返回真

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

如果至少一个值为真(“或”),则为真

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

短路评估?

我刚刚将打印语句插入到 lambda 中,是的,这两个函数都执行短路。

于 2011-06-28T12:55:48.263 回答
42

您可以通过以下方式实施:

和:

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
于 2011-06-28T12:52:46.810 回答
12

您可以使用函数对象logical_andlogical_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 的聪明解决方案是。

于 2011-06-28T12:53:31.920 回答
1

如果您不需要针对不同容器类型的通用算法...

当您正在寻找短路评估时,您可以给 std::valarray 一个机会。and供您使用valarray::min() == true,如 Igor 所述。orstd::find

如果您知道在编译时要存储的元素数量,您甚至可以使用 std::bitset:

bitset<100> container();

//... fill bitset

bool or = container.any();
bool and = container.count() == container.size();
于 2011-06-28T13:29:52.623 回答