【问题标题】:how to add to a map <int, list <int> >如何添加到地图 <int, list <int>>
【发布时间】:2015-11-09 22:33:34
【问题描述】:

假设我有一个像这样的文本文件:

1 2
1 3
2 7
2 8 

我想做的是将这些放在链表的映射中。所以我已经像这样初始化了一个地图,map &lt;int, list&lt;int&gt; &gt; myMap;

我的问题是我不知道如何将其添加到列表中。通常,我们可以通过 myMap[someKey] = someValue; 添加到地图中 我在向列表中添加值时遇到问题。

我想要检查读取的第一个 int 是否在映射中,如果不是,则创建该条目,并将第二个 int 添加到与该键对应的列表中。例如,如果正确完成,第 1 行应该插入一个键 1 和一个元素为 2 的链表。 如果地图已经有那个键,那么该行的第二个 int 应该被添加到它的链表中。例如,第 2 行应该只将元素 3 添加到 1 的链表中。

我希望是这样的:

key : value 
1 : 2 -> 3
2 : 7 -> 8

这是我的代码:

ifstream infile;
infile.open(fname.c_str());
string line = "";
if (infile){
    while (getline(infile, line)){
       istringstream iss(line);
       int tail;
       iss >> tail;
       int edges;
       if (vertices.find(tail) == vertices.end()){
           iss >> edges;
           vertices[tail] = vertices[tail].push_back(edges);
           //I'm getting this error: no viable overloaded '='
       }
       else{
           iss >> edges;
           vertices[tail].push_back(edges);
       }
    }
}

【问题讨论】:

  • 您收到错误,因为 push_back 是一个 void 函数,它不返回列表。所以你不能把它分配给vertices[tail]
  • 要理解错误消息,您需要将行拆分一下vertices[tail] = XX = vertices[tail].push_back(edges);。第二部分查找一个列表,并调用push_back 方法。 Push_back 返回void,所以X 的类型是voidvertices[tail] = X 要求 X 的类型为 list&lt;int&gt;void 不是 list&lt;int&gt;
  • 您需要跳出思维定势。对于更简单的情况,= 是对元素的完整分配。你不想在这里。你的元素是一个列表,你想在上面做.push_back。所以就做.push_back——根本不用=!您不会使用= 在地图外的某个随机列表上执行.push_back。不要害怕从你习惯的简单示例中删除代码。

标签: c++ list dictionary


【解决方案1】:

一旦你从文件中读取了你的两个值,这就是你所需要的:

vertices[tail].push_back(edges);

这将完全符合您的要求。 vertices[tail] 将返回对该地图位置列表的引用。如果该列表尚不存在,则将在此处默认构建一个。无需检查它是否已经存在,因为operator[] 无论如何都会这样做。

【讨论】:

  • 那么看来我在这里不需要 if else 吗?我可以写vertices[tail].push_back(edges)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多