Форум программистов, компьютерный форум CyberForum.ru

Обойтись без If ? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Welder_WD
 Аватар для Welder_WD
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
30.01.2014, 23:46     Обойтись без If ? #1
Доброго времени суток, уважаемые форумчане.
Помогите, пожалуйста, разобраться со сложившейся ситуацией. Есть код:
C++ (Qt)
1
2
3
4
5
for(it = objectsList.begin();it != objectsList.end(); it++) {
    if((*it)->getInfo() == info){
        *it->receiveNotification(message);
    }
}
как можно изменить всю конструкцию, чтоб в ней не было проверки через if() ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Welder_WD
 Аватар для Welder_WD
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
31.01.2014, 11:18  [ТС]     Обойтись без If ? #21
Цитата Сообщение от Tulosba Посмотреть сообщение
Если проверка необходима, и нужно убрать данный if, то он мог бы быть перемещен:
а) до заполнения списка (но по условию не может, т.к. добавляются в любой момент и без проверки)
б) в функцию receiveNotification(message)
в) третьего не дано.
Я зашел в тупик . Функцию переделать нельзя, так как используется общий интерфейс.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.01.2014, 11:30     Обойтись без If ? #22
Цитата Сообщение от Welder_WD Посмотреть сообщение
Я зашел в тупик
Если нужно чтобы в цикле вообще не было условных конструкций, то варианты я уже предложил.
Иначе никак.
Цитата Сообщение от Welder_WD Посмотреть сообщение
так как используется общий интерфейс.
А интерфейс менять и не надо, надо менять тело функции.
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
31.01.2014, 12:04     Обойтись без If ? #23
Не представляю как это можно сделать без проверки. Как извращение можно собственный класс итераторов, который будет проверять сам при смене значения или при его получении, тогда из цикла вообще все исключить можно, кроме самого цикла)
aLarman
31.01.2014, 12:05
  #24

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
А интерфейс менять и не надо, надо менять тело функции.
да лан что там, меняй, напишешь потом адаптер и все хД

Welder_WD
 Аватар для Welder_WD
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
31.01.2014, 12:39  [ТС]     Обойтись без If ? #25
Я уже надумал такое. Использовать STLевский map, а по значению info пытаться воткнуть не 1 объект, а массив объектов. Теперь думаю, реализуемо такое или нет
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
31.01.2014, 12:45     Обойтись без If ? #26
Цитата Сообщение от Welder_WD Посмотреть сообщение
Я уже надумал такое. Использовать STLевский map, а по значению info пытаться воткнуть не 1 объект, а массив объектов. Теперь думаю, реализуемо такое или нет
Тогда нужен multimap, точно не помню название.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
31.01.2014, 12:49     Обойтись без If ? #27
Цитата Сообщение от edwvee Посмотреть сообщение
Тогда нужен multimap, точно не помню название.
Welder_WD-у вроде как раз надо неск значений по единому ключу, мультимап вряд ли, там find возвращает только 1 элемент с таким ключем

Добавлено через 59 секунд
Цитата Сообщение от Welder_WD Посмотреть сообщение
Теперь думаю, реализуемо такое или нет
C++
1
2
3
map<string,vector<Obj> >
 
map<string,list<Obj> >
Welder_WD
 Аватар для Welder_WD
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
31.01.2014, 12:52  [ТС]     Обойтись без If ? #28
Спасибо
Сейчас опробую и отпишусь - вышло это реализовать или нет.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
31.01.2014, 13:24     Обойтись без If ? #29
C++
while(a == true)
{
  goto yes;
}
goto no;
 
yes:
....
goto exit;
 
no:
....
exit:
....
Welder_WD
 Аватар для Welder_WD
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
31.01.2014, 13:30  [ТС]     Обойтись без If ? #30
Сделал я это дело через мап и сет.
Даже работает правильно, но конструкции типа
C++
1
(notifiables[observersTag]).erase(observer);
смотрятся как-то по-индусски .
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
31.01.2014, 13:32     Обойтись без If ? #31
Цитата Сообщение от Welder_WD Посмотреть сообщение
notifiables[observersTag]
аккуратнее с оператором [] в map
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
31.01.2014, 13:39     Обойтись без If ? #32
Цитата Сообщение от aLarman Посмотреть сообщение
аккуратнее с оператором [] в map
Почему?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.01.2014, 13:43     Обойтись без If ? #33
Цитата Сообщение от edwvee Посмотреть сообщение
Почему?
потому что если элемента с указанным ключем нет, он будет вставлен.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,625
Записей в блоге: 17
31.01.2014, 14:36     Обойтись без If ? #34
Цитата Сообщение от edwvee Посмотреть сообщение
Почему?
Через find http://www.cplusplus.com/reference/m...=map%3A%3Afind
Welder_WD
 Аватар для Welder_WD
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 16
31.01.2014, 14:42  [ТС]     Обойтись без If ? #35
Цитата Сообщение от aLarman Посмотреть сообщение
аккуратнее с оператором [] в map
Цитата Сообщение от Tulosba Посмотреть сообщение
потому что если элемента с указанным ключем нет, он будет вставлен.
Однако. Чего не знал, того не знал. Спасибо вам
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2014, 17:23     Обойтись без If ?
Еще ссылки по теме:

C++ Вывод числа в столбик с первой цифры, без массива, без строк
Функция abs и как обойтись без нее C++
C++ Можно ли обойтись без mutex?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
31.01.2014, 17:23     Обойтись без If ? #36
Можно boost::range попробовать, примерно
C++
1
2
3
for (auto & object : objectsList | boost::adaptors::filtered(boost::bind(&object_type::getInfo) == info)) {
   object.recieveNotification(message);
}
Добавлено через 27 минут
boost::bind(...) -> boost::bind(&object_type::info, _1)
Yandex
Объявления
31.01.2014, 17:23     Обойтись без If ?
Ответ Создать тему
Опции темы

Текущее время: 12:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru