我试图用c++读取一个文件并填充代表邻接表的 vector ,该文件包含一个无向加权图的邻接表表示,每一行包括与该特定顶点相邻的节点元组以及长度那个边缘。例如,第六行的第一个条目具有6,指示该行对应于标记为6的顶点。该行的下一个条目“141,8200”指示在顶点6和顶点141之间存在一条边长为8200的边该行的其余对表示与顶点6相邻的其他顶点以及相应边的长度。

文件例如:-

1 3,4 2,20 5,89
2 4,7 1,102

ifstream ifs;
string line;
ifs.open("dijkstraData.txt");
cout<<log(vertices)<<" "<<loops<<endl;
std::vector<vector < std::pair < int,int > > > CadjList(vertices);
while(getline(ifs,line)){
    // transfer the line contents to line_stream
    stringstream line_stream(line);
    //now what
}

最佳答案

首先,我提取顶点并将其放在中,然后将所有后续字符串提取到 rest 中,然后只需查找逗号并将两个子字符串都转换为整数即可。我使用atoi将字符串转换为int,因为我的机器上没有C++ 11,但是我建议您更新gcc并使用std::stoi。

while(getline(ifs,line)){
        stringstream line_stream(line);
        line_stream>>a;
        while(line_stream>>rest){
            int pos = rest.find(",");
            string vertex = rest.substr(0,pos);
            string weight = rest.substr(pos+1,rest.length() - pos);
            int ver = atoi(vertex.c_str());
            int wei = atoi(weight.c_str());
            pair<int,int> foo(ver,wei);
            v[a-1].push_back(foo);
        }
    }

10-01 06:30