2014-01-30 158 views
3

我有一个std::map。给定一个<key, value>对,我需要:插入或更新地图

  • 在地图修改的值,如果键不存在,或者
  • 插入一进图如果该键不存在。

我做这样的:

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

这样做是正确的这种方式?另外,有没有更快或更习惯的方式来做到这一点?

+3

map [key] = value;足够 – IdeaHat

+5

如果密钥不存在,运算符[]'将执行插入操作 – eduffy

回答

3

有各种策略。

最简单的只是使用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到插入或找到的元件,和一个布尔表示的插入件是否成功(true)否(false)。

+0

如何避免给定需求的分配成本? – Slava

+0

@Slava:你如何更新而无需分配? –

+0

这实际上是对您的问题,“如果您更新也会产生分配成本”,为什么会产生无法避免的问题? – Slava