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定数(たとえば、、enumsintなど)を対象としています。
を使用し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

できません。caseswitchステートメントの後の式は、整数のコンパイル時定数でなければなりません。したがって、リテラル(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 に答える