【问题标题】:In unordered_map of C++11, how to update the value of a particular key?在 C++11 的 unordered_map 中,如何更新特定键的值?
【发布时间】:2013-04-30 03:55:22
【问题描述】:

在 Java 的 hashmap 中:

map.put(key, new_value) 

如果 key=key 存在于 hashmap 中,则将其更新为 new_value。

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

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

【问题讨论】:

    标签: c++11 unordered-map


    【解决方案1】:

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

    你也可以使用find,它会返回一个指向值的迭代器:

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

    【讨论】:

    • std::unordered_map::at。如果指定key 的元素不存在,它将抛出std::out_of_range 异常。
    • 谢谢!我使用了unordered_map::const_iterator it = map.find(key),但在尝试将new_value 分配给it->second 时出现错误。 auto 完美运行。我需要了解有关 C++ 的更多信息。。
    • @Yeclipse 那是因为你使用了const_iterator——这意味着迭代器“指向”的是const(也就是说,它不能被改变)。将其修改为 unordered_map::iterator it = map.find(key) 即可工作 - 这就是 auto 的推论。
    • 第二部分错了,it->second 不是参考。分配给它不会更新映射中的值,只会更新迭代器的值副本。
    • @jturcotte 对*it 的取消引用操作将为您返回一个引用,这将是一个std::pair<const K, T>& 用于unordered_map<K, T>。因此修改it->second 将修改存储在容器中的值。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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



      public V put(K key, V value)

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

      这相当于unordered_map::operator[]:

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

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

      【讨论】:

        【解决方案4】:
        1. 检查密钥是否存在
        2. 通过引用键更新值
        if(map.count(key)){
          map[key] = value;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 2021-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多