2014-02-28 41 views
1

我的容器是這樣的:如何在列表中插入值到列表對?

map<DWORD, list<pair<string,LARGE_INTEGER>>> map_to_list_items; 

此代碼不能編譯:

map<DWORD, list<pair<string,LARGE_INTEGER>>>::iterator iter_map_to_list_items = map_list_items.find(dwThreadID); 
if (iter_map_to_list_items == map_to_list_items.end()) 
{ 
    map_to_list_itens.insert (pair<DWORD,pair<string,LARGE_INTEGER>>(dwTheadID, (string("Start"), m_TimePRE))); 
} 
+2

你的編譯器說什麼錯誤? – CoryKramer

+4

地圖的值類型是成對的列表,但您只想插入一對 – Brian

+0

我看到您正在使用'>>>'而不是'>>>(注意空格)關閉您的模板。你在使用C++ 11嗎? –

回答

1

我的理解是,你有兩個變量是這樣的:

map<DWORD, list<pair<string, LARGE_INTEGER>>> map_to_list_items; 
map<DWORD, list<pair<string, LARGE_INTEGER>>> map_list_tempos_threads; 

可以做,以簡化代碼的第一件事就是使用新的C++ 11的auto關鍵字,而不是明確鍵入整個繁瑣的迭代器名稱:

auto it = map_list_tempos_threads.find(dwThreadID); 

(請注意,你可能在你的代碼中的一些錯別字,因爲你有dwTheadID而不是dwThreadID..._itens而不是..._items)。

然後,您可以簡單地使用std::map::operator[]超載在地圖上插入新項目,如果它是不存在:

if (it == map_to_list_items.end()) 
{ 
    // 
    // Insert the new list<pair<string, LARGE_INTEGER>> in the map, 
    // assuming: 
    // - key: dwThreadID 
    // - string: "Start" 
    // - LARGE_INTEGER: m_TimePRE 
    // 

    list<pair<string, LARGE_INTEGER>> l;  
    string s = "Start"; 
    l.push_back(make_pair(s, m_TimePRE))  // I'm assuming m_TimePRE is a LARGE_INTEGER 
    map_to_list_items[dwThreadID] = move(l); // Move the list into the map 
} 

編輯:

這是一個非常短的版本爲插入的代碼:

map_to_list_items[dwThreadID].emplace_back("Start", m_TimePRE); 

關鍵的一點是,如果dwThreadID(該「鑰匙」)在地圖中是而不是,默認構造的「值」(即, list<pair<string, LARGE_INTEGER>>)在地圖上由operator[]重載創建,並返回對其的引用。
然後,在該引用上調用list::emplace_back(),並將新的("Start", m_TimePRE)對添加到(以前爲空,因爲默認構造的)列表。

在這種形式下輸入的數量要少得多,但是有幾項操作發生在「引擎蓋下」;相反,在第一種形式中,代碼及其邏輯步驟更加明確。

1

您正在試圖插入pair<string, LARGE_INTEGER>list<pair<string, LARGE_INTEGER>>

I.e.你有一個map<D, list<pair<S, L>>它看起來像這樣:

D1 -> list [pair1, pair2, pair3, ...]

D2 -> list [pair4, ...]

你正在嘗試做的事:

D3 -> pairX

你應該做的:

D3 -> list[pairX]

1
map<DWORD, list<pair<string,LARGE_INTEGER>>> map_to_list_itens; 

所以,你有地圖,有型的價值

list<pair<string,LARGE_INTEGER>> 

您要添加到地圖後(如價值/ 「第二個參數」)只是一對(另一件事,錯誤的類型)。

(pair<DWORD,pair<string,LARGE_INTEGER>>(dwTheadID, (string("Start"), m_TimePRE))); 

如果你有

map<T1, list<pair<T2,T3> > > my_map; 

你應該增加,否則列出。喜歡這裏:

my_map[T1_object].push_back(make_pair(T2_object, T3_object)); //or 
my_map[T1_object].push_back(T2_T3_pair_object); 
//or in C++11 
my_map[T1_object].emplace_back(T2,T3); 

更多關於它,你可以參考,maplist閱讀。我建議從easier example開始瞭解它是如何工作的,就像這裏一樣。

+1

這是最乾淨和最可讀的方式。 'my_map [non_existent_key]'會自動插入一個默認構造的(空)'列表>',並且如果'non_existent_key'不在映射中則返回一個引用。 –