我有std::map
。给定<key, value>
对,我需要:
我这样做:
if (map.find(key) == map.end()){
map.insert(std::pair<int, char>(key, value));
}
else {
map[key] = value;
}
这种做法是否正确?此外,还有更快或更惯用的方法吗?
答案 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);
它甚至适用于不可默认构造或不可复制的键和值类型。