2014-01-30 126 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