2012-04-30 3 views
0

у меня есть это:Использование станд :: Карта внутри коммутатора случае

map<string,int> a; 
int b; 

И я хотел бы сделать это:

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

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

    etc. 
} 

Но это не компилирует. Как это реализовать правильно?

+2

Вероятно, ошибка при компиляции объясняет, почему. – RvdK

+0

Коммутатор работает только с ординалами, такими как ints http://www.cplusplus.com/faq/sequences/strings/switch-on-string/, вам нужно выполнить сравнение '==', например 'if (" someStr1 "== а) {сделать что-то; } ' – EdChum

+0

вы можете добавить ошибку, которую вы получили во время компиляции –

ответ

4

switch Условия должны быть постоянными, поэтому то, что вы хотите сделать здесь, невозможно.

Вам лучше использовать некоторые операторы if.

+0

Нет, проблемы нет здесь –

+0

@ Fippo да, это было первое, что появилось. Это просто незаконно. –

+0

Thanx, но существует ли более элегантное решение? –

1

switch/case предназначены для констант (например, enum, int и др.).
Вы можете использовать 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.

1

Вы не можете. Выражение после case в операторе switch должно быть интегральной константой времени компиляции. Таким образом, литерал (42), const int variable инициализируется литералом (const int x = 66 ... case x:) или значением перечисления. И вот об этом.

Причина, по которой это так строго, является эффективностью. Компиляторы обычно создают ярлыки для каждого case, и если вы знаете значение для каждой метки во время компиляции, вы можете сделать несколько хороших оптимизаций, чтобы избежать большей части служебных данных, которые имеет нормальное разветвление кода.

В вашем случае просто пойти с, если-то еще:

if(b == a["someStr1"]) { 
    //... 
} else if(b == a["someStr2"]) { 
    //... 
} // and so on 
Смежные вопросы