在我的程序中有几次,我不得不检查一个变量是否是众多选项之一。例如
if (num = (<1 or 2 or 3>)) { DO STUFF }
我搞砸了“或”,但似乎没有什么是正确的。我试过了
if (num == (1 || 2 || 3))
但它什么也没做。
我想方便地区分几个组。例如
if (num = (1,2,3))
else if (num = (4,5,6))
else if (num = (7,8,9))
最佳答案
这是 C++11 中的一种方式,使用 std::initializer_list
:
#include <algorithm>
#include <initializer_list>
template <typename T>
bool is_in(const T& v, std::initializer_list<T> lst)
{
return std::find(std::begin(lst), std::end(lst), v) != std::end(lst);
}
有了它,你可以这样做:
if (is_in(num, {1, 2, 3})) { DO STUFF }
虽然不与内置类型一起使用时效率不是很高。 int
可以正常工作,但是如果你比较 std::string
变量,例如,生成的代码很糟糕。
然而,在 C++17 中,您可以改用更高效的解决方案,适用于任何类型:
template<typename First, typename ... T>
bool is_in(First &&first, T && ... t)
{
return ((first == t) || ...);
}
// ...
// s1, s2, s3, s4 are strings.
if (is_in(s1, s2, s3, s4)) // ...
C++11 版本在这里效率非常低,而这个版本应该产生与手写比较相同的代码。
关于c++ - 将变量与多个值进行比较的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15181579/