有没有像“std :: and”或“std :: or”这样的东西?

时间:2011-06-28 12:48:57

标签: c++ algorithm boolean std short-circuiting

给定一个布尔值的容器(例如std::vector<bool>),如果所有值都是true(“和”)或{{},是否有标准函数返回true 1}}如果至少有一个值是true(“或”),那么短路评估会是什么?

我今天早上挖了www.cplusplus.com但是找不到任何东西。

4 个答案:

答案 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_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的聪明解决方案是。

答案 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();