3 回答
TA贡献1865条经验 获得超7个赞
如果要检查的值足够小,则可以为要查找的值创建一个位掩码,然后检查要设置的位。
假设您关心几个小组。
static const unsigned values_group_1 = (1 << 1) | (1 << 2) | (1 << 3);
static const unsigned values_group_2 = (1 << 4) | (1 << 5) | (1 << 6);
static const unsigned values_group_3 = (1 << 7) | (1 << 8) | (1 << 9);
if ((1 << value_to_check) & values_group_1) {
// You found a match for group 1
}
if ((1 << value_to_check) & values_group_2) {
// You found a match for group 2
}
if ((1 << value_to_check) & values_group_3) {
// You found a match for group 3
}
这种方法最适合于不超过CPU喜欢使用的自然大小的值。在现代通常为64,但是可能会因环境的不同而有所不同。
TA贡献1827条经验 获得超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版本将是非常低效的位置,而这个版本应该产生相同的代码手写比较。
- 3 回答
- 0 关注
- 718 浏览
添加回答
举报