31

在 Java 的哈希图中:

map.put(key, new_value) 

如果 key=key 存在于 hashmap 中,将使用 new_value 更新它的条目。

在 C++11 的 unordered_map 中做类似事情的正确方法是什么?

我还没有找到像 updateXXX 这样的 API,文档说unordered_map::insert函数只有在没有任何这样的密钥对时才会成功。

4

4 回答 4

50

如果您知道键在映射中,则可以利用operator[]which 返回对映射值的引用。因此它将是map[key] = new_value。但是要小心,因为(key, new_value)如果映射中不存在该键,这将插入 a。

您还可以使用findwhich 返回值的迭代器:

auto it = map.find(key)
if(it != map.end()) 
    it->second = new_value;
于 2013-04-30T03:58:47.110 回答
2

如果该类型value没有默认构造函数,您可以使用:

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

这也具有 emplace vs [] 运算符和插入的所有其他优点。

于 2019-05-26T19:16:18.223 回答
1

我认为map.put如果元素不在地图中,Java 会插入该元素,如果它在地图中,则对其进行更新,请参阅put

put

public V put(K key, V value)

将指定值与此映射中的指定键相关联。如果映射先前包含键的映射,则替换旧值。

这相当于unordered_map::operator[]

如果 k 匹配容器中元素的键,则该函数返回对其映射值的引用。

如果 k 不匹配容器中任何元素的键,则该函数使用该键插入一个新元素并返回对其映射值的引用。请注意,这总是将容器大小增加一,即使没有为元素分配映射值(该元素是使用其默认构造函数构造的)。

于 2013-04-30T06:58:19.567 回答
0
  1. 检查密钥是否存在
  2. 通过引用键更新值
if(map.count(key)){
  map[key] = value;
}
于 2021-05-13T07:57:24.240 回答