插入或更新地图

时间:2014-01-30 17:52:42

标签: c++

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

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

我这样做:

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

这种做法是否正确?此外,还有更快或更惯用的方法吗?

2 个答案:

答案 0 :(得分:4)

有各种策略。

最简单的就是使用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<iterator, bool>,它为插入或找到的元素产生iterator,并且指示插入是否成功的布尔值({{1} })或不(true)。

答案 1 :(得分:0)

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

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

或者更简单:

map.insert_or_assign(key, value);

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