是否有类似“std::and”的东西?或“std::or”?

发布于 2024-11-17 15:41:36 字数 323 浏览 4 评论 0原文

给定一个布尔值容器(例如 std::vector),是否存在一个标准函数,如果所有值都是 true,则返回 true(“和”)或 true 如果至少有一个值为 true(“或”),并进行短路评估?

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

Given a container of boolean values (An example is std::vector<bool>), is there a standard function that returns true if all the values are true ("and") or true if at least one value is true ("or"), with short circuit evalutation ?

I digged trough www.cplusplus.com this morning but couldn't find anything close.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

人间☆小暴躁 2024-11-24 15:41:36

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

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

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

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

有短路评估吗?

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

is there a standard function that returns true if all the values are true ("and")

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

or true if at least one value is true ("or")

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

with short circuit evalutation?

I just inserted print statements into the lambda, and yes, both functions perform short-circuiting.

徒留西风 2024-11-24 15:41:36

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

AND:

std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true

OR:

std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true

You can implement by:

AND:

std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true

OR:

std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true
┈┾☆殇 2024-11-24 15:41:36

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

You can use the function objects logical_and and logical_or in conjunction with a reduction to accomplish that.

accumulate calculates the reduction. Hence:

bool any = std::accumulate(foo.begin(), foo.end(), false, std::logical_or<>());
bool all = std::accumulate(foo.begin(), foo.end(), true, std::logical_and<>());

Caveat: this is not using short-circuiting (the accumulate function knows nothing about short-circuiting even though the functors do), while Igor’s clever solution is.

爱冒险 2024-11-24 15:41:36

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

当您正在寻找短路评估时,您可以给 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();

If you do not need a generic algorithm for different container types...

As you are looking for short circuit evaluation, you may give std::valarray a chance. For and use valarray::min() == true for or you could use std::find as mentioned by Igor.

In case you know the number of elements to store at compile time, you could even use a std::bitset:

bitset<100> container();

//... fill bitset

bool or = container.any();
bool and = container.count() == container.size();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文