在开关案例中使用std :: map

时间:2012-04-30 08:16:02

标签: c++ map switch-statement

我有这个:

map<string,int> a;
int b;

我想这样做:

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

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

  etc.
}

但它没有编译。如何正确实现?

3 个答案:

答案 0 :(得分:4)

switch条件必须是常量,所以你不想在这里做什么。

最好使用一些if语句。

答案 1 :(得分:1)

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