【发布时间】:2015-11-09 22:33:34
【问题描述】:
假设我有一个像这样的文本文件:
1 2
1 3
2 7
2 8
我想做的是将这些放在链表的映射中。所以我已经像这样初始化了一个地图,map <int, list<int> > 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] = X和X = vertices[tail].push_back(edges);。第二部分查找一个列表,并调用push_back方法。 Push_back 返回void,所以X的类型是void。vertices[tail] = X要求 X 的类型为list<int>。void不是list<int>。 -
您需要跳出思维定势。对于更简单的情况,
=是对元素的完整分配。你不想在这里。你的元素是一个列表,你想在上面做.push_back。所以就做.push_back——根本不用=!您不会使用=在地图外的某个随机列表上执行.push_back。不要害怕从你习惯的简单示例中删除代码。
标签: c++ list dictionary