у меня есть вектор, я могу пробежаться по нему через for() и if()
vector<int> vec{1,2,3,4,5};
for(auto i=0;i<vec.size();i++)
{
if(vec[i] == 1)
//do smth...
if(vec[i] == 2)
//do smth...
if(vec[i] == 3)
//do smth...
if(vec[i] == 4)
//do smth...
if(vec[i] == 5)
//do smth...
}
как мне переделать это через конструкцию switch case?
for(int i(0);i<vec.size();i++)
{
switch(vec[i])
{
case 1:
//do smth...
break;
case 2:
//do smth...
break;
// etc
default:
//do smth...
break;
}
}
Учитывая, что в общем случае в do smth может присутствовать модификация элементов вектора, а также что каждый последующий if при отсутствии в do smth команд типа break, return, continue ... будет требовать проверки, эквивалентный код со switch будет достаточно странным (и всё равно содержать if):
for (size_t i = 0; i < vec.size(); i++)
{
int visited = 0;
again:
switch(vec[i]) {
case 1: if (visited >= 1) break; visited = 1; /* do smth... */ goto again;
case 2: if (visited >= 2) break; visited = 2; /* do smth... */ goto again;
case 3: if (visited >= 3) break; visited = 3; /* do smth... */ goto again;
case 4: if (visited >= 4) break; visited = 4; /* do smth... */ goto again;
case 5: if (visited >= 5) break; visited = 5; /* do smth... */ goto again;
}
}
Можно подсунуть сюда макрос:
#define v(i) if (visited >= i) break; visited = i
Но это всё равно будет выглядеть не менее странно:
for (size_t i = 0; i < vec.size(); i++)
{
int visited = 0;
again:
switch(vec[i]) {
case 1: v(i); /* do smth... */ goto again;
case 2: v(i); /* do smth... */ goto again;
case 3: v(i); /* do smth... */ goto again;
case 4: v(i); /* do smth... */ goto again;
case 5: v(i); /* do smth... */ goto again;
}
}
P.S. заодно, я заменил int на size_t, т.к. размер вектора всё-таки имеет беззнаковый тип.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости