我正在努力弄清楚如何将此文件读入 map 。我首先将文件读入 vector 。然后尝试获取 vector 中的字符串值并将其插入到映射中。我完全迷路了。

第一个值是键,有序对是值。我需要添加“无限数量的值”

1 2,1 8,2
2 1,1 3,1
3 2,1 4,1
4 3,1 5,1
5 4,1 6,1
6 5,1 7,1
7 6,1 8,1
8 7,1 1,2

当前阅读代码:
int main(int argc, char const *argv[]){

     map<int, string> map;
     vector<string> v;
     vector<int>    v2;
     string line;
     string fileName(argv[1]);
     ifstream inputFile;
     inputFile.open(fileName);

     while(getline(inputFile, line)){
         v.push_back(line);
     }

    return 0;
}

最佳答案

您指定每行的初始值是一个连续键,每行的其余值由空格分隔的元组组成,每个元组是两个用逗号分隔的值,第一个值是其他一些标识符,并且因此,同一行上所有元组的第一个值将是唯一的。

因此,我建议使用以下数据结构:

typedef std::vector<std::map<int, int>> map_t;

vector 索引将是初始键。 vector 索引从0开始,在数据文件中从1开始,但这很容易处理。要么更改您的数据文件,要么继续使用没有数据的键0。

vector 中的每个值都是一个映射。 map 的键是“另一个节点” ID,值是到另一个节点的距离-根据您对该数据含义的描述。

该数据结构将很好地对该数据建模。现在,就读取和解析此数据而言:

最初的方法是正确的:使用std::getline()一次将每一行读入一个字符串:
map_t my_map;

std::string line;

while (std::getline(inputFile, line)) {

    // Here be dragons

}

首先,将每个line放入字符串 vector 并没有任何收获。我们可以在阅读时简单地解析每一行。在循环内部,我们将处理读取的每一行,并将其数据直接放入my_map中。那是计划。简单,容易和直接。

在循环内部,我们首先将每一行放入std::istringstream以便对其进行解析,然后提取初始节点ID:
int node_id;

std::istringstream line_stream(line);

line_stream >> node_id;

很简单。如果您需要处理错误的输入,则应该能够自己在此处以及其余代码中找出如何检查转换失败的方法。

现在,我们只需要拔出每个“other_node,distance”元组对:
std::string node_distance;
std::map<int, int> node_distance_map;

while (line_stream >> node_distance)
{
     // Here be more dragons.
}

就是这样。在循环中,有更多的龙,node_distance将是每个单独的“n,n”字符串,具有两个值。这很简单,您可以自己弄清楚:如何自己从字符串中提取这两个整数;然后更新node_distance_map。然后,在此while_loop之后,您将构造的node_distance_mapnode_id提早提取,并将整个内容填充到my_map中。任务完成。这似乎并不困难,不是吗?

关于c++ - 我如何将这个文件读入 map C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39885860/

10-11 22:44
查看更多