Russian Qt Forum
Ноябрь 23, 2024, 12:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: std::map (поиск + вставка)  (Прочитано 4852 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 03, 2013, 10:13 »

Добрый день

Код
C++ (Qt)
typedef std::pair <int, int> TPair;
typedef std::map<int, int> TMap;
TMap theMap;
TPair elem(1, 2);
 
TMap::iterator it = theMap.find(elem.first);
if (it == theMap.end())
theMap.insert(elem);
else
it->second += elem.second;
 
 
Если элемента нет в мапе - вставляем, иначе наращиваем value. Однако поиск выполняется дважды: один раз для проверки, второй для вставки. Как избежать этих затрат?

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Февраль 03, 2013, 10:23 »

Однако поиск выполняется дважды: один раз для проверки, второй для вставки.
Почему не просто так:
Код
C++ (Qt)
theMap[ elem.first ] += elem.second;
 
« Последнее редактирование: Февраль 03, 2013, 10:25 от Old » Записан
vregess
Гость
« Ответ #2 : Февраль 03, 2013, 10:32 »

Код
C++ (Qt)
TMap::iterator it = theMap.lower_bound(elem.first);
 
if (it != theMap.end() && !theMap.key_comp()(elem.first, it->first))
 // do update
else
 theMap.insert(it, elem);
 

подробности: совет 24. Эффективное использование STL, Мейерс.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Февраль 03, 2013, 10:47 »

Код
C++ (Qt)
TMap::iterator it = theMap.lower_bound(elem.first);
 
if (it != theMap.end() && !theMap.key_comp()(elem.first, it->first))
 // do update
else
 theMap.insert(it, elem);
 
Вы процитировали практически дословно operator[] из map. Подмигивающий
« Последнее редактирование: Февраль 03, 2013, 10:50 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 03, 2013, 11:33 »

Почему не просто так:
Код
C++ (Qt)
theMap[ elem.first ] += elem.second;
 
В общем случае конструктор по умолчанию может и не устроить. Может так
Код
C++ (Qt)
size_t old = theMap.size();
int & value = theMap[elem.first];
if (theMap.size() > old)
value = elem.second;
else
valie += elem.second;
 

Код
C++ (Qt)
TMap::iterator it = theMap.lower_bound(elem.first);
 
if (it != theMap.end() && !theMap.key_comp()(elem.first, it->first))
 // do update
else
 theMap.insert(it, elem);
 
Да, вставка с хинтом (читал но не сообразил). Спасибо

Вы процитировали практически дословно operator[] из map. Подмигивающий
А можно подробнее (а то все намеками  Улыбающийся)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Февраль 03, 2013, 11:37 »

Может так
Смеющийся
А чем отличается:
Код
C++ (Qt)
val = defaultVal;
от
Код
C++ (Qt)
val = 0; //Создается конструктором
val += defaultVal;
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Февраль 03, 2013, 11:38 »

А можно подробнее (а то все намеками  Улыбающийся)
В смысле подробней?
Это код оператора [] из map.
Записан
vregess
Гость
« Ответ #7 : Февраль 03, 2013, 12:31 »

Это код оператора [] из map.

С той лишь разницей, что не создается лишний объект конструктором по умолчанию.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.192 секунд. Запросов: 22.