您好,我有以下代码:
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 个枚举成员,那么我们如何提前检查所有成员。请帮忙。
如果在您的情况下,如果表达式的值在编译时已知,则现代编译器应该能够优化此类代码。对于可读性和错误检查,我认为使用 aswitch
会更好:
switch (val) {
case a:;
case b:;
....
// your code goes here
}
如前所述,性能方面应该没有太大差异,如果合适的话,编译器会将其转换为表查找(或其他聪明的东西),或者如果val
在编译时已知,则完全优化它。
但是您可以在此处获得错误检查编译器的优势。如果您没有default
案例,大多数编译器会在您省略枚举常量之一时警告您。另外我认为这更清楚,因为它不会重复val
所有地方的评估。
其他(更快)解决方案如下
bool isInenum (int val)
{
bool retVal = false
switch(val)
{
case a:
case b:
case c:
case d:
{
retVal = true;
}
}
return retVal;
}
由于枚举器的值是按顺序分配的,因此使用这样的 if 语句就足够了:
如果(val<=z)
您可以在 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