C - 将值插入std :: map时

C++ - Segmentation fault when inserting values into std::map

本文关键字:map std 插入      更新时间:2023-10-16

我正在尝试在C 中构建一个图形实例解析器,该分析器将图节作为输入,然后将它们插入由柠檬库定义的SmartGraph类中。

库不允许我插入具有特定ID的节点(据我在文档中看到),因此我创建了一个并行结构来存储输入文件的节点ID之间的关系我的代码中实际图的节点ID(可能有一种巧妙的方式可以解决这个问题,但是我对此并没有太多考虑,只要实例不那么庞大,我用完了记忆,这几乎是不可能的)。为此,我正在使用将输入文件ID作为密钥的std ::映射,而图节点ID作为值。

此std ::映射在循环的迭代编号239中崩溃,如果我刚执行程序,则读取输入文件的行,如果我使用valgrind进行检查,它将达到2252,这使我认为我必须是在某个地方进行非常大的监督和泄漏的记忆,但我无法弄清楚。代码如下

#include <lemon/smart_graph.h>
#include <lemon/concepts/graph.h>
#include <iostream>
#include <fstream>
#include <map>
#include <string>
using std::cout;
using std::cin;
using std::getline;
using std::vector;
using std::string;
using std::stringstream;
using std::exception;
using std::ifstream;
using std::ios;
using std::map;
using lemon::SmartGraph;
map<int, int> instance_graph_ids;
map<int, int>::iterator it;
SmartGraph graph;
ifstream input_instance("instance.txt", ios::in);
string current_line;
while (getline (input_instance, current_line))
    {
        stringstream stream(current_line);
        string buffer;
        vector <int> separated_nodes;
        while(getline(stream, buffer, 't')){
            separated_nodes.push_back(stoi(buffer));
        };
        for (int node : separated_nodes){
            it = instance_graph_ids.find(node);
            if (it == instance_graph_ids.end())
                {
                    int new_node_id;
                    SmartGraph::Node new_node = graph.addNode();
                    new_node_id = graph.id(new_node);
                    instance_graph_ids.insert({ node, new_node_id });
                };
        };
        auto first_node_iterator = instance_graph_ids.find(separated_nodes[0]);
        auto second_node_iterator = instance_graph_ids.find(separated_nodes[1]);
        graph.addEdge( graph.nodeFromId(first_node_iterator -> first),graph.nodeFromId(second_node_iterator -> second));
    }

我知道这很丑陋,但是我试图在开始技巧之前让它工作,所以请在这里忍受。节点是输入文件中节点的ID,表示为整数。它在尝试.insert()instance_graph_ids中的值时会崩溃,这是我之前写过的地图结构。我已经使用GDB进行了检查,New_node_id都是普通的整数,并且Instance_graph_id上的现有值对我来说也可以。尝试调用gdb中的instance_graph_ids中的find()或insert()返回"尝试在存储器中获取未位于内存中的值地址"错误。我在这里缺少什么?


编辑了一个完整的示例。示例实例可以从https://snap.stanford.edu/data/oregon1_010331.txt.gz

下载

您应该将first_node_iterator->first更改为first_node_iterator->second

graph.addEdge(graph.nodeFromId(first_node_iterator->second),
              graph.nodeFromId(second_node_iterator->second));

例如,处理" 10000 4725"的第一行
使用std :: vector将节点存储在SmartGraph中,
graph.addEdge时,std :: vector上只有两个元素,
您将first_node_iterator-> first(值为10000)作为下标,它超出了范围。

修改的代码:

#include <lemon/smart_graph.h>
#include <lemon/concepts/graph.h>
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <assert.h>
using std::cout;
using std::cin;
using std::getline;
using std::vector;
using std::string;
using std::stringstream;
using std::exception;
using std::ifstream;
using std::ios;
using std::map;
using lemon::SmartGraph;
int main()
{
    map<int, int> instance_graph_ids;
    map<int, int>::iterator it;
    SmartGraph graph;
    ifstream input_instance("instance.txt", ios::in);
    string current_line;
    while (getline (input_instance, current_line)) {
        stringstream stream(current_line);
        string buffer;
        vector <int> separated_nodes;
        while (getline(stream, buffer, 't')) {
            separated_nodes.push_back(stoi(buffer));
        };
        for (int node : separated_nodes) {
            it = instance_graph_ids.find(node);
            if (it == instance_graph_ids.end()) {
                int new_node_id;
                SmartGraph::Node new_node = graph.addNode();
                new_node_id = graph.id(new_node);
                instance_graph_ids.insert({ node, new_node_id });
            };
        };
        auto first_node_iterator = instance_graph_ids.find(separated_nodes[0]);
        auto second_node_iterator = instance_graph_ids.find(separated_nodes[1]);
        assert(first_node_iterator->second < graph.nodeNum());
        graph.addEdge(graph.nodeFromId(first_node_iterator->second),
                      graph.nodeFromId(second_node_iterator->second));
    }
    return 0;
}
相关文章: