首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查C++中的多个值是否相等

检查C++中的多个值是否相等
EN

Stack Overflow用户
提问于 2020-11-05 14:37:02
回答 3查看 253关注 0票数 3

我在C++中寻找一种简单、快速和描述性的方法来检查一个值是否包含在一组固定的其他值中。就像Python一样,人们可以在那里编写

代码语言:javascript
运行
复制
if some_function() in (2, 3, 5, 7, 11):
    do_something()

一些明显的选择是:

如果所讨论的值是整数,则可以编写如下内容:

开关(some_function()) {案例2:案例3:案例5:案例7:案例11: do_something();}

不幸的是,这只适用于整数,而且我敢说它不是很漂亮。

  1. 使用局部变量来保留临时结果:

const x= some_function();if (x == 2\x == 3+x == 5+x == 7=x == 11) do_something();

我想避免使用命名的临时变量。此外,这是冗长的编写和容易出错的.

  1. 使用std::set:可以将其写入(至少在C++20中)如下:

if (std::set({ 2,3,5,7,11 }).contains(some_function()) do_something();

这有点不错,但恐怕它有一些沉重的STL开销。

还有其他更便宜的方法吗?也许是一些不同的模板解决方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-05 14:41:14

是的,您确实可以编写一个可变模板函数,并结合一个折叠表达式,如下所示:

代码语言:javascript
运行
复制
namespace my 
{
  template<typename T, typename ... Vals>
  bool any_of(T t, Vals ...vals)
  {
     return (... || (t == vals));
  }
}  

然后像这样使用它:

代码语言:javascript
运行
复制
if (my::any_of(some_function(), 2, 3, 5, 7, 11))
{
    do_something();
}

请注意,我将any_of放在一个名称空间中,以避免与std::any_of混淆,这是一个完全不同的函数。

票数 8
EN

Stack Overflow用户

发布于 2020-11-05 16:34:49

关于问题的fast部分的一些数据:

我用VisualStudio2019 (C++ Compiler19.27.29122)编译了三个明显的解决方案,并使用完全优化(/Ox /std:c++latest)编译了@cigien,并查看了汇编程序输出。以下是我的发现:

  1. 此解决方案转化为甜蜜的BT指令(x64)或跳转表(x86),两者都只有大约10行汇编程序.

  1. 又是一个BT指令(x64)或明显的5行比较(x86),再一次是大约10行。

  1. 快速地说,这是可怕的: 120行,调用其他函数9次,总共1500 (!)台词。此外,它还需要异常和C++20.

  1. @cigien的解决方案: x64和x86.

的解决方案相同

底线:模板版本不仅短而有表现力,而且体积小,速度快。

票数 2
EN

Stack Overflow用户

发布于 2020-11-05 15:57:38

如果是关于风格的话,所有这些都与c/c++无关。

如果是关于性能的

代码语言:javascript
运行
复制
#include <iostream>
#include <algorithm>
#include <execution>

int main(int argc , char *argv[])
{
    int b[] = {1 ,4 ,7 ,8};
    int c = 4;
    bool e = std::any_of(std::execution::par, b, &b[0] + sizeof(b)/sizeof(int), [=](int a){ return a == c; });
    if (e) std::cout << "cool " << std::endl;
}

c++ -O3 --std=c++17 a.cpp -o t -ltbb

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64699393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档