私はこれを持っています:
map<string,int> a;
int b;
そして私はこれを作りたいです:
switch(b)
{
case a["someStr1"]:
someCode1();
break;
case a["someStr2"]:
someCode2();
break;
etc.
}
しかし、それはコンパイルされません。これを正しく実装する方法は?
私はこれを持っています:
map<string,int> a;
int b;
そして私はこれを作りたいです:
switch(b)
{
case a["someStr1"]:
someCode1();
break;
case a["someStr2"]:
someCode2();
break;
etc.
}
しかし、それはコンパイルされません。これを正しく実装する方法は?
switch
条件は定数である必要があるため、ここで実行したいことは不可能です。
if
いくつかのステートメントを使用する方が良いでしょう。
switch/case
定数(たとえば、、enum
sint
など)を対象としています。
を使用し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
。
できません。case
switchステートメントの後の式は、整数のコンパイル時定数でなければなりません。したがって、リテラル(42
)、const int変数は、リテラル(const int x = 66
... case x:
)または列挙値で初期化されます。そしてそれについてです。
これが非常に厳しい理由は効率です。コンパイラは通常、それぞれcase
にラベルを作成します。コンパイル時に各ラベルの値がわかっている場合は、通常のコード分岐のオーバーヘッドのほとんどを回避するために、いくつかの優れた最適化を行うことができます。
あなたの場合は、if-elseを使用してください。
if(b == a["someStr1"]) {
//...
} else if(b == a["someStr2"]) {
//...
} // and so on