2013-10-12 114 views
0

如何高效地在std :: map中插入元素?一個常見的要求是,如果地圖已經有元素鍵,則返回false;否則插入它並返回true。我找不到一個好的方法來做到這一點。如何高效地在地圖中插入元素?

template<class Key, class Value> 
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap); 
+0

您可以使用返回std :: pair 的插入變體,該變量告訴您​​它是否是插入,或者您是否有權訪問C++ 11插入提示。請參見[本參考](http://www.cplusplus.com/reference/map/map/insert/)並單擊「C++ 11」選項卡。 – kfsone

回答

4

如何使用std::map::emplace

template<class Key, class Value> 
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap) 
{ 
    return myMap.emplace(key,value).second; 
} 

在情況下,它無法在你的環境,你可以使用

template<class Key, class Value> 
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap) 
{ 
    typedef typename std::map<Key, Value>::value_type value_type; 
    return myMap.insert(value_type(key,value)).second; 
} 
+0

@POW你需要一個map-value-type構造;即'std :: pair '(我發現Daniel已經更新了使用地圖'value_type' typedef的答案,這也是我將如何做的,但是接下來我再次使用C++ 11,所以..我不會=))。 – WhozCraig

1

從丹尼爾斯回答繼,可我建議使用插入( )而不是emplace(),並在你的類上提供一個單獨的emplace()方法,如果你需要的話?

原因是emplace()使隱式構造函數成爲可能。這意味着如果Value不可複製,則需要使用map.insert或確保Value提供移動賦值運算符。 insert()也保持與C++ 11之前的編譯器的向後兼容性(如果這可能是一個問題)。

template<class Key, class Value> 
bool insert(Key const& key, Value const& value, std::map<Key, Value>& myMap) 
{ 
    return myMap.insert(std::make_pair(key,value)).second; 
} 

template<class Key, class Value> 
bool emplace(Key const& key, Value const& value, std::map<Key, Value>& myMap) 
{ 
    return myMap.emplace(key,value).second; 
} 
+0

如果該值不可複製,那麼'emplace'如何工作?請注意,'map'的'emplace'非常奇怪,因爲它是構造的'value_type'! –

相關問題