为了账号安全,请及时绑定邮箱和手机立即绑定

C ++比较变量和多个值的最有效方法?

C ++比较变量和多个值的最有效方法?

C++
慕村225694 2019-11-18 18:35:58
在程序中几次,我不得不检查变量是否是许多选项之一。例如if (num = (<1 or 2 or 3>)) { DO STUFF }我已经把“ OR”弄乱了,但是似乎没有什么是对的。我试过了if (num == (1 || 2 || 3))但它什么也没做。请帮忙!提前致谢。PS我需要区分几个组。例如...if (num = (1,2,3))else if (num = (4,5,6))else if (num = (7,8,9))
查看完整描述

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,但是可能会因环境的不同而有所不同。


查看完整回答
反对 回复 2019-11-18
?
素胚勾勒不出你

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版本将是非常低效的位置,而这个版本应该产生相同的代码手写比较。


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 648 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信