2015-12-03 18 views
1

我有一個std::map。我找到了一個鍵的下界,並確保這個鍵在地圖中沒有被使用。我可以插入一個元素給給定的迭代器的地圖嗎?如果是這樣如何?我可以將一個元素插入給定的迭代器中嗎?

map<int, double> m; 
int key = 1; 
auto itr = m.lower_bound(key); 
if (itr == m.end() || itr->first != key) 
    m.insert(itr, make_pair(key, 3.14)); // how is the performance? Any better way? 
+2

它工作嗎?如果是這樣,很好。如果沒有,告訴我們它不工作的方式。至於「表現如何?」,請根據您的選擇進行測量。我們無法預測您的代碼,構建配置,編譯器,操作系統,平臺,體系結構和計算機的行爲。 –

+2

只使用插入有什麼問題?它已經檢查密鑰是否存在。 – Kevin

回答

3

關聯容器的要求說一下emplace_hint及相關業務的複雜性「在一般的對數,但如果該元素p前右插分期常量」(其中p是暗示迭代器)。

所以,如果你只使用正確的提示,那麼複雜度是攤銷常量,獨立於地圖的大小。 (當然,你仍然需要執行初始查找的代價。)

1

insert()的「提示」版本的思想是映射可以傳遞迭代器作爲對象可以到達的指示。有保證,如果在p之前插入t,則表現爲「攤銷不變。」 (其中p是提示迭代器)。

如果構建的價格合理便宜,建議直接使用m.insert(std::make_pair(key, 3.14)):如果insert()失敗,則元素保持不變。該函數返回std::pair<iterator, bool>,其中first元素指向新插入的元素,second元素指示節點是否已插入。

+2

如果密鑰不存在於地圖中,則「lower_bound」和「upper_bound」是等價的。 –

+0

@ T.C .:真的 - 我沒有想到通過正確的。我將刪除答案的相應部分...謝謝。 –

相關問題