2014-02-28 44 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'不在映射中则返回一个引用。 –