解释一下这段代码:while (getline(conv_reader, line)) { if (check++ > 1) { std::vector <std::string> tokens = splitLine(line, '\t'); nodes_set_str.insert(tokens[0]); //add the first interactor to the list nodes_set_str.insert(tokens[1]); //add the second interactor to the list } } conv_reader.close(); // creating a node for each labels for (auto gene : nodes_set_str) { n = (*intActGraph).new_node(); nodes_set.insert(n); nodes_map[gene] = n; (*nodes_map_rev)[index(n)] = gene; } // creating edges std::ifstream conv_reader1(file); check = 0; while (getline(conv_reader1, line)) if (check++ > 0) { std::vector <std::string> tokens = splitLine(line, '\t'); n = nodes_map[tokens[0]]; v = nodes_map[tokens[1]]; e = (*intActGraph).new_edge(n, v); edges_set.insert(e); } conv_reader1.close();
时间: 2024-03-15 13:42:50 浏览: 73
functions_parsing_data:C ++中有用的解析数据功能
这段代码的作用是根据读取的文件内容,构建一个图(Graph)。具体地说,程序首先使用 while 循环从文件 conv_reader 中读取每一行数据,并将其存储在 line 变量中。在每次循环中,程序检查 check 变量的值是否大于 1,如果是,则执行下面的操作:
程序调用 splitLine 函数,将 line 字符串按照 '\t' 分隔符进行切割,得到一个字符串向量 tokens。然后程序将 tokens 中的第一个元素和第二个元素分别插入到 nodes_set_str 集合中。这个集合用于存储所有的节点(即参与者),它是一个字符串类型的集合,用于去重。
接着,程序关闭文件 conv_reader,然后使用 for 循环遍历 nodes_set_str 集合中的每一个元素,为每一个元素创建一个节点(Node),并将这些节点存储在 nodes_set 集合中。程序还使用 nodes_map 和 nodes_map_rev 两个映射表,将每个节点与对应的参与者名称进行映射。其中,nodes_map 的类型是 std::unordered_map<Node*, std::string>,它将每个节点与对应的参与者名称进行映射;nodes_map_rev 的类型是 std::unordered_map<int, std::string>,它将每个节点的索引号(即节点在图中的位置)与对应的参与者名称进行映射。
最后,程序再次打开文件 conv_reader1,使用 while 循环从文件中读取每一行数据,并将其存储在 line 变量中。在每次循环中,程序检查 check 变量的值是否大于 0,如果是,则执行下面的操作:
程序调用 splitLine 函数,将 line 字符串按照 '\t' 分隔符进行切割,得到一个字符串向量 tokens。然后程序使用 nodes_map 映射表,将 tokens 中的第一个元素和第二个元素分别转换为对应的节点,并将这两个节点之间创建一条边(Edge),并将这些边存储在 edges_set 集合中。
阅读全文