C - 将值插入std :: map时
C++ - Segmentation fault when inserting values into std::map
我正在尝试在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;
}
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏