您好,我有以下代码:
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个枚举成员,那么我们如何才能提前检查所有成员。
请帮忙。
答案 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