0

我有这个:

map<string,int> a;
int b;

我想做这个:

switch(b)
{
  case a["someStr1"]:
  someCode1();
  break;

  case a["someStr2"]:
  someCode2();
  break;

  etc.
}

但它不编译。如何正确实施?

4

3 回答 3

4

switch条件需要是常数,所以你想在这里做的事情是不可能的。

你最好使用一些if语句。

于 2012-04-30T08:17:18.753 回答
1

switch/case用于常量(例如,enumints 等)。
您可以使用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.

于 2012-04-30T08:22:36.240 回答
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
于 2012-04-30T08:29:01.343 回答