【问题标题】:How can I insert values at map to list pair?如何在地图上插入值到列表对?
【发布时间】:2014-02-28 18:55:59
【问题描述】:

我的容器是这样的:

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

【问题讨论】:

  • 你的编译器说什么错误?
  • 地图的值类型是对的列表,但您只是尝试插入一对
  • 我看到您使用&gt;&gt;&gt; 而不是&gt; &gt; &gt;(注意空格)关闭模板。你在用 C++11 吗?
  • 您不应编辑嵌入答案的问题...
  • 这是丑陋的“正确解决方案”!应该是一两行(最多)。

标签: c++ list dictionary stl


【解决方案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”)在map中not,则默认构造一个“value”(即list&lt;pair&lt;string, LARGE_INTEGER&gt;&gt;)由operator[]重载在映射中创建,并返回对其的引用。
然后,在该引用上调用 list::emplace_back(),并将新的 ("Start", m_TimePRE) 对添加到(以前为空,因为默认构造)列表中。

使用这种形式,需要输入的内容要少得多,但会在“幕后”进行一些操作;相反,在第一种形式中,代码及其逻辑步骤更加明确。

【讨论】:

    【解决方案2】:

    您正在尝试将pair&lt;string, LARGE_INTEGER&gt; 插入为list&lt;pair&lt;string, LARGE_INTEGER&gt;&gt;

    即你有一个map&lt;D, list&lt;pair&lt;S, L&gt;&gt;,看起来像这样:

    D1 -&gt; list [pair1, pair2, pair3, ...]

    D2 -&gt; list [pair4, ...]

    你要做什么:

    D3 -&gt; pairX,

    你应该做什么:

    D3 -&gt; list[pairX]

    【讨论】:

      【解决方案3】:
      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 开始了解它的工作原理,就像这里一样。

      【讨论】:

      • 这是最干净、最易读的方法。 my_map[non_existent_key] 自动插入一个默认构造(空)list&lt;pair&lt;T2,T3&gt; &gt; 并在 non_existent_key 不在地图中时返回对它的引用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2014-04-29
      • 1970-01-01
      • 2020-10-22
      • 2022-11-08
      相关资源
      最近更新 更多