C++ C++;使用邻接迭代器的boost图库分割错误

C++ C++;使用邻接迭代器的boost图库分割错误,c++,segmentation-fault,boost-graph,C++,Segmentation Fault,Boost Graph,我正在尝试使用Boost图形库创建一个名为GraphService的类。 它应该计算图上的各种内容,并将节点度分布等属性返回给其他类。这是我的headerfile中图形的一部分,称为graph.h: typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertex_info, edge_info, graph_info, boost::li

我正在尝试使用Boost图形库创建一个名为GraphService的类。 它应该计算图上的各种内容,并将节点度分布等属性返回给其他类。这是我的headerfile中图形的一部分,称为graph.h:

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS,
                          vertex_info, edge_info, graph_info, boost::listS> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor VertexDescriptor;
typedef boost::graph_traits<Graph>::edge_descriptor EdgeDescriptor;
typedef boost::graph_traits<Graph>::vertex_iterator VertexIterator;
typedef boost::graph_traits<Graph>::edge_iterator EdgeIterator;
typedef boost::graph_traits<Graph>::adjacency_iterator AdjacencyIterator;
这似乎是指邻接迭代器的错误。调试器告诉我,由于迭代器的作用,错误发生了

我曾尝试在一个脚本中运行相同的代码,其中图形的创建和相邻_顶点的迭代在同一个函数中。那里一切正常

有人能帮忙吗


提前谢谢

我同意,特别是关于您前面的问题,您可能有超出所示代码范围的错误(?)

显示的代码可以正常工作,请参见以下内容:

#include <boost/graph/adjacency_list.hpp>
#include <boost/multi_array.hpp>

using namespace boost;

struct vertex_info {
    int id = []{ static int s_gen = 0; return ++s_gen; }();
};

struct edge_info {
};

struct graph_info {
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertex_info, edge_info, graph_info, boost::listS>
    Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor VertexDescriptor;
typedef boost::graph_traits<Graph>::edge_descriptor EdgeDescriptor;
typedef boost::graph_traits<Graph>::vertex_iterator VertexIterator;
typedef boost::graph_traits<Graph>::edge_iterator EdgeIterator;
typedef boost::graph_traits<Graph>::adjacency_iterator AdjacencyIterator;
typedef multi_array<int, 3> array3i;

class GraphService {
  private:
    Graph g;

  public:
    GraphService(Graph graph) { g = graph; }
    std::vector<int> get_adjacent(int i);
};

std::vector<int> GraphService::get_adjacent(int i)
{
    AdjacencyIterator first, last;
    std::vector<int> vertex_vector;
    vertex_vector.push_back(i);

    for (tie(first, last) = adjacent_vertices(i, g); first != last; ++first) {
        vertex_vector.push_back(g[*first].id);
    }

    return vertex_vector;
}

#include <iostream>
#include <boost/graph/random.hpp>
#include <random>

int main() {
    std::mt19937 prng { std::random_device{}() };
    Graph example;
    generate_random_graph(example, 100, 200, prng);

    GraphService let_clone_that(example);

    std::cout << "adjacent to 42: ";
    for(int v: let_clone_that.get_adjacent(42))
        std::cout << v << " ";
}

在没有看到更多代码的情况下,我唯一的猜测是
g
可能无法初始化。想想看,这就是问题所在。谢谢是的,非常感谢。问题是我没有正确地实例化图形。我在单元测试中出错了
#include "Graph.h"

GraphService::GraphService(Graph graph) {
g = graph
}



std::vector<int> GraphService::get_adjacent(int i) {
    AdjacencyIterator first, last;
    std::vector<int> vertex_vector;
    vertex_vector.push_back(i);

    for (tie(first,last) = adjacent_vertices(i,g); first != last; ++first) {

        vertex_vector.push_back(g[*first].id);
    }

    return vertex_vector;
}
/bin/sh: line 7: 20148 Segmentation fault      build/Debug/GNU-Linux-x86/tests/TestFiles/f2
#include <boost/graph/adjacency_list.hpp>
#include <boost/multi_array.hpp>

using namespace boost;

struct vertex_info {
    int id = []{ static int s_gen = 0; return ++s_gen; }();
};

struct edge_info {
};

struct graph_info {
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertex_info, edge_info, graph_info, boost::listS>
    Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor VertexDescriptor;
typedef boost::graph_traits<Graph>::edge_descriptor EdgeDescriptor;
typedef boost::graph_traits<Graph>::vertex_iterator VertexIterator;
typedef boost::graph_traits<Graph>::edge_iterator EdgeIterator;
typedef boost::graph_traits<Graph>::adjacency_iterator AdjacencyIterator;
typedef multi_array<int, 3> array3i;

class GraphService {
  private:
    Graph g;

  public:
    GraphService(Graph graph) { g = graph; }
    std::vector<int> get_adjacent(int i);
};

std::vector<int> GraphService::get_adjacent(int i)
{
    AdjacencyIterator first, last;
    std::vector<int> vertex_vector;
    vertex_vector.push_back(i);

    for (tie(first, last) = adjacent_vertices(i, g); first != last; ++first) {
        vertex_vector.push_back(g[*first].id);
    }

    return vertex_vector;
}

#include <iostream>
#include <boost/graph/random.hpp>
#include <random>

int main() {
    std::mt19937 prng { std::random_device{}() };
    Graph example;
    generate_random_graph(example, 100, 200, prng);

    GraphService let_clone_that(example);

    std::cout << "adjacent to 42: ";
    for(int v: let_clone_that.get_adjacent(42))
        std::cout << v << " ";
}
adjacent to 42: 42 71 38 3 14