В unordered_map С++ 11, как обновить значение определенного ключа? - программирование
Подтвердить что ты не робот

В unordered_map С++ 11, как обновить значение определенного ключа?

В Java hashmap:

map.put(key, new_value) 

обновит запись key = key с помощью new_value, если она существует в hashmap.

Каков правильный способ сделать подобное в unordered_map С++ 11?

Я не нашел API, например updateXXX, и в документации говорится, что функция unordered_map:: insert будет успешной только тогда, когда нет такой пары с ключом.

4b9b3361

Ответ 1

Если вы знаете, что ключ находится на карте, вы можете использовать operator[], который возвращает ссылку на сопоставленное значение. Следовательно, оно будет map[key] = new_value. Однако будьте осторожны, так как это добавит (key, new_value), если ключ еще не существует на карте.

Вы также можете использовать find, который возвращает итератор в значение:

auto it = map.find(key)
if(it != map.end()) 
    it->second = new_value;

Ответ 2

Я думал, что Java map.put вставил элемент, если он еще не был на карте, и обновил его, если он был на карте, см. put:

положить

public V put (ключ K, значение V)

Связывает указанное значение с указанным ключом на этой карте. Если ранее карта содержала отображение для ключа, старое значение заменяется.

Это будет эквивалентно unordered_map:: operator []:

Если k соответствует ключу элемента в контейнере, функция возвращает ссылку на его отображаемое значение.

Если k не соответствует ключу любого элемента в контейнере, функция вставляет новый элемент с этим ключом и возвращает ссылку на его отображаемое значение. Обратите внимание, что это всегда увеличивает размер контейнера на единицу, даже если для элемента не назначено сопоставленное значение (элемент создается с использованием его конструктора по умолчанию).

Ответ 3

Если value типа не имеет конструктора по умолчанию, вы можете использовать:

map.emplace(key, new_value).first->second = new_value;

Это также имеет все другие преимущества оператора emplace vs [] и вставки.