私はこれを持っています:
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定数(たとえば、、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。
できません。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