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

2024-01-28

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

if (num = (<1 or 2 or 3>)) { DO STUFF }

我已经搞乱了“OR”,但似乎没有什么是正确的。我试过了

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 版本在这里效率非常低,而该版本应该生成与手写比较相同的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将变量与多个值进行比较的最有效方法? 的相关文章

随机推荐