如何在地图到列表对中插入值?

时间:2014-02-28 18:56:00

标签: c++ list dictionary stl

我的容器是这样的:

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)));
}

3 个答案:

答案 0 :(得分:1)

您正尝试将pair<string, LARGE_INTEGER>作为list<pair<string, LARGE_INTEGER>>插入。

即。你有一个map<D, list<pair<S, L>>,如下所示:

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

D2 -> list [pair4, ...]

您要做的是:

D3 -> pairX

你应该做什么:

D3 -> list[pairX]

答案 1 :(得分: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“key”)在地图中,则默认构造的“值“(即list<pair<string, LARGE_INTEGER>>)在地图中由operator[]重载创建,并返回对它的引用。
然后,在该引用上调用list::emplace_back(),并将新的("Start", m_TimePRE)对添加到(以前为空,自默认构造)列表中。

使用这种形式,键入的内容要少得多,但有几项操作“在引擎盖下”;相反,在第一种形式中,代码及其逻辑步骤更明确。

答案 2 :(得分: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开始,了解它是如何工作的,就像这里一样。