2010-10-07 42 views
107

我發現檢查重複的唯一方法是插入並檢查std::pair.secondfalse,但問題是,如果密鑰未使用,它仍會插入某些內容,而我想要的是map.contains(key);函數。如何檢查std :: map是否包含沒有插入的鍵?

+3

可能重複[如何找到一個給定的鍵在C++的std ::地圖存在(http://stackoverflow.com/questions/1939953/how-to-find-if-a-given -key-exists-in-ac-stdmap) – OrangeDog 2014-07-24 12:34:04

回答

231

使用my_map.count(key);它只能返回0或1,這實質上是你想要的布爾結果。

或者my_map.find(key) != my_map.end()也可以。

+5

-1:應該使用'find'。對於映射和多映射,它至少與'count'一樣高效,並且當您考慮對發現的鍵進行更改的典型需求時效率更高。 – 2011-06-03 14:26:04

+29

@John:那種不成熟的優化。在GCC上(我確定最合理的系統),'map :: count'實現爲'find(__ x)== end()? 0:1;'。對於'multimap'你可能會有一個表現的爭論,但這不是OP的問題,我仍然更喜歡優雅。 – Potatoswatter 2011-06-03 23:09:21

+24

不,過早優化參數僅在優化需要花費一些努力時纔有效,在這種情況下優化不需要。 – markh44 2011-11-10 10:21:02

39

Potatoswatter的回答是沒問題,但我更喜歡用findlower_bound來代替。 lower_bound特別有用,因爲如果您希望使用相同的鍵插入某些內容,則返回的迭代器可以隨後用於提示插入。

map<K, V>::iterator iter(my_map.lower_bound(key)); 
if (iter == my_map.end() || key < iter->first) { // not found 
    // ... 
    my_map.insert(iter, make_pair(key, value));  // hinted insertion 
} else { 
    // ... use iter->second here 
} 
+0

這與他有着微妙的不同說他正在這樣做......唯一的區別是,如果插入是不必要的,可以跳過'value'的計算。 – Potatoswatter 2010-10-07 23:23:28

+0

當然,我知道OP不在意插入,所以基於'lower_bound'的解決方案是矯枉過正的。我剛纔提到我的答案是「完整性」;就像我說的那樣,你完全夠了。 :-) – 2010-10-07 23:29:56

+3

是的,這是一個很好的答案,我不反對任何事情。只是指出與先驗「插入」的替代關係。實際上,如果使用'multimap'還有另一個區別,'lower_bound'方法會在等效範圍的開始處插入,而普通的'insert'方法會添加到範圍的末尾。 – Potatoswatter 2010-10-07 23:35:58