2012-12-05 42 views
1

我有一個 unordered_map<string, list<SomeClass>::iterator>unordered_map迭代器 - 如何檢查未初始化的元素

我想插入在這個圖中的元素,但只有當它不存在。如果存在,我不想覆蓋現有的項目。此外,我想避免做兩個查找來檢查項目是否存在,然後進行插入。我得出的結論是我應該使用operator []來獲取帶有該鍵的元素,檢查它是否有效,如果沒有,則初始化它。問題是元素是一個迭代器,我必須檢查它是否被初始化,這是不可能的。我可以使用派生自列表迭代器類的類,並實現defautl構造函數以將其初始化爲「無效」值,但在構造函數中,我無法訪問列表實例以獲取其end()迭代器。 任何想法如何做到這一點?

回答

3

使用insertemplace,如果它已經存在,這將不會覆蓋值:

auto i = m.insert(std::make_pair("hello"), my_iterator); 
auto j = m.emplace("hello", my_iterator);     // same 

可以測試i.second看到插入成功與否,以及i.first是一個迭代的地圖元素。

+0

哈!叫我笨,但我一直認爲插入覆蓋值:) –

+2

@AlexanderVassilev來自[此插入參考](http://en.cppreference.com/w/cpp/container/unordered_map/insert):「如果容器中尚未包含具有等效鍵的元素,則將元素插入到容器中。「 –