我有这个:
map<string,int> a;
int b;
我想这样做:
switch(b)
{
case a["someStr1"]:
someCode1();
break;
case a["someStr2"]:
someCode2();
break;
etc.
}
但它没有编译。如何正确实现?
答案 0 :(得分:4)
switch
条件必须是常量,所以你不想在这里做什么。
最好使用一些if
语句。
答案 1 :(得分:1)
switch/case
适用于常量(例如enum
,int
等。)
您可以使用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_each
替换for
循环的选项。
答案 2 :(得分:1)
你做不到。
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