【问题标题】:Insert or update a map插入或更新地图
【发布时间】:2014-01-30 17:52:41
【问题描述】:

我有一个std::map。给定一对<key, value>,我需要:

  • 如果key存在则修改map中的值,或者
  • 如果密钥尚不存在,则将该对插入映射中。

我是这样做的:

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

这种做法正确吗?另外,是否有更快或更惯用的方法来做到这一点?

【问题讨论】:

  • 地图[键] = 值;足够了
  • operator[] 将插入,如果密钥不存在

标签: c++


【解决方案1】:

有多种策略。

最简单的就是使用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&lt;iterator, bool&gt;,它为插入或找到的元素生成一个iterator,一个布尔值指示插入是否成功(true)或不成功(false )。

【讨论】:

  • 在给定要求的情况下如何避免分配成本?
  • 这其实是对你的疑问,“更新也会产生分配成本”,为什么会产生无法避免的?
  • @Slava:对不起,我不明白你的第二条评论;英语似乎不是你的第一语言,它也不是我的:/
【解决方案2】:

对于 C++17,您可以使用以下代码:

auto [iterator, inserted] = map.try_emplace(key, value);
if (!inserted) { iterator->second = value; }

甚至更简单:

map.insert_or_assign(key, value);

它甚至适用于不可默认构造或不可复制的键和值类型。

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 2016-05-02
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2012-10-29
    • 2011-01-17
    相关资源
    最近更新 更多