我在C++中寻找一种简单、快速和描述性的方法来检查一个值是否包含在一组固定的其他值中。就像Python一样,人们可以在那里编写
if some_function() in (2, 3, 5, 7, 11):
do_something()
一些明显的选择是:
如果所讨论的值是整数,则可以编写如下内容:
开关(some_function()) {案例2:案例3:案例5:案例7:案例11: do_something();}
不幸的是,这只适用于整数,而且我敢说它不是很漂亮。
const x= some_function();if (x == 2\x == 3+x == 5+x == 7=x == 11) do_something();
我想避免使用命名的临时变量。此外,这是冗长的编写和容易出错的.
std::set
:可以将其写入(至少在C++20中)如下:if (std::set({ 2,3,5,7,11 }).contains(some_function()) do_something();
这有点不错,但恐怕它有一些沉重的STL开销。
还有其他更便宜的方法吗?也许是一些不同的模板解决方案?
发布于 2020-11-05 14:41:14
是的,您确实可以编写一个可变模板函数,并结合一个折叠表达式,如下所示:
namespace my
{
template<typename T, typename ... Vals>
bool any_of(T t, Vals ...vals)
{
return (... || (t == vals));
}
}
然后像这样使用它:
if (my::any_of(some_function(), 2, 3, 5, 7, 11))
{
do_something();
}
请注意,我将any_of
放在一个名称空间中,以避免与std::any_of
混淆,这是一个完全不同的函数。
发布于 2020-11-05 16:34:49
关于问题的fast
部分的一些数据:
我用VisualStudio2019 (C++ Compiler19.27.29122)编译了三个明显的解决方案,并使用完全优化(/Ox /std:c++latest
)编译了@cigien,并查看了汇编程序输出。以下是我的发现:
BT
指令(x64)或跳转表(x86),两者都只有大约10行汇编程序.。
BT
指令(x64)或明显的5行比较(x86),再一次是大约10行。。
的解决方案相同
底线:模板版本不仅短而有表现力,而且体积小,速度快。
发布于 2020-11-05 15:57:38
如果是关于风格的话,所有这些都与c/c++无关。
如果是关于性能的
#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
https://stackoverflow.com/questions/64699393
复制相似问题