2014-01-30 3 views
3

У меня есть std::map. Учитывая <key, value> пар, мне нужно:Внести или обновить карту

  • Измените значение в карте, если ключ существует, или
  • Вставьте пару в карту, если ключ еще не существует.

Я делаю это так:

if (map.find(key) == map.end()){ 
    map.insert(std::pair<int, char>(key, value)); 
} 
else { 
    map[key] = value; 
} 

Является ли это способ сделать это правильно? Кроме того, существует ли более быстрый или более идиоматический способ сделать это?

+3

map [ключ] = значение; достаточно – IdeaHat

+5

'operator []' будет делать вставку, если ключ не существует – eduffy

ответ

3

Существуют различные стратегии.

Простейшим просто использовать operator []:

map[key] = value; 

однако это требует, чтобы value быть по умолчанию конструктивны и переуступке. Кроме того, поскольку эти операции происходят, они могут (в некоторых случаях) привести к проблемам с производительностью.

Другое решение:

auto const result = map.insert(std::make_pair(key, value)); 
if (not result.second) { result.first->second = value; } 

Вы, конечно, также нести расходы на задание, если вы обновляете, но избежать его, если вставка работ.

Для справки, возвращаемое значение insert является std::pair<iterator, bool>, который дает iterator к элементу вставляться или найден, и логическое значение указано, была ли вставка успешно (true) или нет (false).

+0

Как можно избежать затрат на присваивание с заданными требованиями? – Slava

+0

@Slava: Как вы можете обновить без назначения? –

+0

, который на самом деле является вопросом для вас, «также несут стоимость задания, если вы обновляете», почему взять на себя то, чего нельзя избежать? – Slava

Смежные вопросы