В unordered_map С++ 11, как обновить значение определенного ключа?
В Java hashmap:
map.put(key, new_value)
обновит запись key = key с помощью new_value, если она существует в hashmap.
Каков правильный способ сделать подобное в unordered_map С++ 11?
Я не нашел API, например updateXXX, и в документации говорится, что функция unordered_map:: insert будет успешной только тогда, когда нет такой пары с ключом.
Ответы
Ответ 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 [] и вставки.