在开关盒内使用 std::map

Using std::map inside switch case

本文关键字:std map 开关      更新时间:2023-10-16

>我有这个:

map<string,int> a;
int b;

我想做这个:

switch(b)
{
  case a["someStr1"]:
  someCode1();
  break;
  case a["someStr2"]:
  someCode2();
  break;
  etc.
}

但它不会编译。如何正确实现这一点?

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

你最好使用一些if语句。

>switch/case用于常量(例如,enumint 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 ), 常量 int 变量初始化为文字 ( const int x = 66 ... case x: ) 或枚举值。仅此而已。

如此严格的原因是效率。编译器通常会为每个case创建标签,如果您在编译时知道每个标签的值,则可以进行一些不错的优化,以避免正常代码分支的大部分开销。

在您的情况下,只需使用 if-else:

if(b == a["someStr1"]) {
    //...
} else if(b == a["someStr2"]) {
    //...
}   // and so on