我有这个:
map<string,int> a;
int b;
我想做这个:
switch(b)
{
case a["someStr1"]:
someCode1();
break;
case a["someStr2"]:
someCode2();
break;
etc.
}
但它不编译。如何正确实施?
我有这个:
map<string,int> a;
int b;
我想做这个:
switch(b)
{
case a["someStr1"]:
someCode1();
break;
case a["someStr2"]:
someCode2();
break;
etc.
}
但它不编译。如何正确实施?
switch
条件需要是常数,所以你想在这里做的事情是不可能的。
你最好使用一些if
语句。
switch/case
用于常量(例如,enum
、int
s 等)。
您可以使用map<>::iterator
来遍历这些值并与 进行比较b
。
for(map<string,int>::const_iterator it = a.begin(), end = a.end(); it != end; it++)
{
if(it->second == b)
{
...
break;
}
}
a
如果您足够大,这样您就可以避免代码重复进行比较。
此外,您可以探索将for
循环替换为for_each
.
你不能。switch 语句中的表达式case
必须是整数编译时常量。所以一个字面量 ( 42
) , const int 变量用字面量 ( const int x = 66
... case x:
) 或枚举值初始化。就是这样。
之所以如此严格,是因为效率。编译器通常为每个标签创建标签case
,如果您在编译时知道每个标签的值,您可以进行一些很好的优化,以避免正常代码分支的大部分开销。
在您的情况下,只需使用 if-else:
if(b == a["someStr1"]) {
//...
} else if(b == a["someStr2"]) {
//...
} // and so on