c++ - 将变量与多个值进行比较的最有效方法?

标签 c++ variables if-statement comparison

在我的程序中有几次,我不得不检查一个变量是否是众多选项之一。例如

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/

相关文章:

java - 使用最终变量实现循环

c - 在 C 中使用静态变量的最佳实践

sql - mysql 变量赋值

java - 在 Java 中获取列表内的字段详细信息,而无需大的 if else 条件

c - if (i++) 条件如何工作?

c++ - 使用 C++(和 GSL)扩展和嵌入 Python(和 NumPy): pass gsl_matrix to python and back

c++ - 为什么我每次使用 mingw gcc4.8.1 运行 std::random_device 都会得到相同的序列?

c++ - 我可以使表达式constexpr吗?

c++ - 在 Visual C++ 编译器中使用 std::initializer_list 2012 年 11 月 CTP

php - Switch Case 或 if else if 哪个更快更好?