Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2010, 10:59   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию switch

есть строка str, и в ней текст. Но вот сделать переключатель не получается:
Код:
switch(str)
{
case "test": return 0;
}
Код:
switch quantity not an integer
case label does not reduce to an integer constant
как можно сделать переключатель со строками?
Артэс вне форума Ответить с цитированием
Старый 29.05.2010, 11:08   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

switch работает только со встроенными типами (хотя, может, только с приводимыми к целым - int, char, насчет double не знаю). Но со строками он не работает точно. Поэтому приходится использовать if - else if - ... - else:
Код:
std::string str;
if (str == "test)
 {/**/}
else if (str == "something")
 {/**/}
//...
else
 {/**/}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 29.05.2010, 11:13   #3
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

или же :
Код:
const int SAMPLE_LENGTH  = 2;
const std::string sample[ SAMPLE_LENGTH ] = { "asd", "sda" };
for( int i = 0; i < SAMPLE_LENGTH; ++i )
   if( sample[ i ] == str )
      switch( i ){
      case 0 :
         ...;
         break;
      case 1 :
         ...;
         break;
      }
Что выглядит всё же лучше, чем мнохо-мнохо if'ов.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 29.05.2010, 11:13   #4
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

понятно. что ж, Спасибо.

А вообще switch работает быстрее чем if?
Артэс вне форума Ответить с цитированием
Старый 29.05.2010, 11:22   #5
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

да, switch это goto модернезированное )
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 29.05.2010, 11:32   #6
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

с другой стороны, процессорное время так же тратится на присваение номера переменной i и прочего сравнения, для дальнейшей работы со switch. Даже, включая дополнительную работу, такой вариант будет быстрее обычного сравнения строк через if (на языке Си)?
Код:
if(!strcmp(str,"test")){...}
else
if(!strcmp(str,"string")){...}
else
if(!strcmp(str,"something")){...}
Артэс вне форума Ответить с цитированием
Старый 29.05.2010, 13:21   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ozo
Цитата:
да, switch это goto модернезированное )
а if не goto модернизированное? теж cmp, jne, jnz и тд. имхо разница в быстродействии если и есть, то она настолько мелка, чтоб так "оптимизировать"
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 29.05.2010, 13:36   #8
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

раз уж пошла речь о быстродействии, заодно спрошу, если в цикле должен выполняться один код, причем тысячи раз в секунду, несомненно, размещенный прямиком в цикле код, будет быстрее работать... например
Код:
while(...)
{
...код...
}
но вот если весь код (он может быть большим), который выполняется в цикле, поместить в определенную функцию, скажем test(); например
Код:
test()
{
...код... 
}
и вызывать его из того цикла:

Код:
while(...)
{
test();
}
Вызов функции, это же еще дополнительная работа:
нужно вычислить адрес, передать управление, выполнить код, и вернуть управление...
учитывая, что функция test() может содержать сотни строк, и выполняться в цикле тысячи раз.

Отсюда вопрос: Насколько ощутима будет потеря в производительности, если я буду выполнять код не в самом цикле, а через функцию, вызывая её каждый раз?

Последний раз редактировалось Артэс; 29.05.2010 в 13:40.
Артэс вне форума Ответить с цитированием
Старый 29.05.2010, 13:47   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Если заботитесь о быстродействии, то делайте функцию inline и, если компилятор будет к вам благосклонен, ваши проблемы решатся.
А если компилятор в плане оптимизации очень умный, то, возможно, он и без вас разберется, как в этом случае поступить.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 29.05.2010, 13:56   #10
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Сейчас почитал про inline, забавно.

Получается, если компилятор примет этот запрос, то разницы в производительности между выполнением кода в цикле и через функцию совсем не будет? или даже учитывая inline, лидерство в скорости будет за кодом в самом цикле?
Артэс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на switch ProgramerBeatz Общие вопросы C/C++ 12 25.01.2011 00:59
switch Dimarik Общие вопросы C/C++ 4 11.04.2010 15:56
switch и string??? i-cpp Общие вопросы C/C++ 7 12.02.2010 14:58
SWITCH 8 портовый SKS Компьютерное железо 3 29.01.2009 03:39
Switch Division Общие вопросы C/C++ 3 11.01.2009 23:52