Как переделать if на switch при работе с vector в C++ [закрыт]

123
14 августа 2019, 06:10

у меня есть вектор, я могу пробежаться по нему через 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?

Answer 1
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;
    }
}
Answer 2

Учитывая, что в общем случае в 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, т.к. размер вектора всё-таки имеет беззнаковый тип.

READ ALSO
Как узнать цвет пикселя в текстуре?

Как узнать цвет пикселя в текстуре?

Есть у меня текстура в формате TGAЗная Х и У как я могу получить цвет пикселя? Какие библиотеки для этого подключить или скачать?

131
Как в richedit отключить звук

Как в richedit отключить звук

Если, когда курсор находится в позиции 0,0 нажать влево или вверх (те

139
Помогите исправить код( нужно чтобы код содержал две функции по мимо main())

Помогите исправить код( нужно чтобы код содержал две функции по мимо main())

Нужно сделать функцию, которая будет принимать от пользователя его вариант, а также другую функцию, которая будет определять, соответствует...

92
Как работает метод insert в в классе Vector в с++?

Как работает метод insert в в классе Vector в с++?

В методе insert класса Vector нужно передать итератор указывающий на позицию в которую ты хочешь поместить элемент, я правильно понимаю что для...

159