使用枚举成员值检查变量值的优化方法

时间:2012-10-17 06:54:42

标签: c++ c enums

您好,我有以下代码:

enum {a, b, c, d, ..., z} abc;

int main()
{
  int val = 20;
  if (val == a || val == b ||val == c||val == d..... || val == z)
  {
    /*Do something*/
  }
}

还有其他方法可以跳过OR操作,因为如果有1000个枚举成员,那么我们如何才能提前检查所有成员。 请帮忙。

4 个答案:

答案 0 :(得分:5)

如果在编译时已知表达式的值,则现代编译器应该能够优化此类代码。为了便于阅读和错误检查,我认为使用switch会更好:

switch (val)  {
 case a:;
 case b:;
 ....
 // your code goes here
}

如上所述,性能方面不应该有太大区别,编译器会在适当的情况下将其转换为表查找(或其他聪明的东西),或者如果在编译时已知val则完全优化它。

但是你可以在这里获得错误检查编译器的优势。如果您没有default大小写,大多数编译器会在您省略其中一个枚举常量时发出警告。此外,我认为这更清楚,因为它不会重复对val所有地方的评估。

答案 1 :(得分:1)

其他(更快)的解决方案将是以下

bool isInenum (int val)
{
    bool retVal = false
        switch(val)

    {
        case a:
        case b:
        case c:
        case d:
            {
                retVal = true;
            }

    }
    return retVal;
}

答案 2 :(得分:0)

由于枚举器值是按顺序分配的,因此放置这样的if语句就足够了:

如果(VAL< = Z)

答案 3 :(得分:0)

您可以在C ++中使用地图。使用地图,您可以编写紧凑的测试,而无需使用大量==||

但是您首先需要初始化地图,我不确定您是否可以以紧凑的方式对任意枚举进行初始化。

#include <iostream>
#include <map>

using namespace std;

enum abc { a = 1, b = -1, c = 3, d = 0 };

int main()
{
  map<int, int> m;
  m[a] = m[b] = m[c] = m[d] = 1;
  cout << "b is " << ((m.find(b) == m.end()) ? "NOT " : "") << "in m" << endl;
  cout << "3 is " << ((m.find(3) == m.end()) ? "NOT " : "") << "in m" << endl;
  cout << "10 is " << ((m.find(10) == m.end()) ? "NOT " : "") << "in m" << endl;
  return 0;
}

输出(ideone):

b is in m
3 is in m
10 is NOT in m