2015-06-11 57 views
2

我想要使用Boost圖庫創建一個名爲GraphService的類。 它應該在圖上計算各種東西並返回屬性,如節點度分佈到其他類。這是我headerfile的圖形,這就是所謂Graph.h的一部分:C++ boost圖庫分割故障與adjacency_iterator

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; 

這是我Headerfile對GraphService部分:

#include "Graph.h" 
class GraphService { 
    private: 
     Graph g; 
    public: 
     std::vector<int> get_adjacent(int i); 
} 

是困擾我的一部分,是這樣的:

#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 

這似乎是指與adjacency_iterator錯誤。調試器告訴我,由於迭代器最後發生錯誤。

我試圖在腳本中運行相同的代碼,其中創建的圖形和迭代over adjacent_vertices在同一個函數中。一切工作正常。

任何人都可以幫忙嗎?

在此先感謝!

+0

沒有看到更多的代碼,我唯一的猜測是'g'不能被初始化。考慮一個[SSCCE](http://sscce.org/)。 – pbible

+0

這是問題所在。謝謝 – benhal

回答

1

我同意,尤其是對於您之前的問題,您可能在顯示的代碼之外有錯誤(Undefined Behaviour?)。

顯示可能只是工作的代碼,請參閱本SSCCE

Live On Coliru

#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 
+0

是的,非常感謝你。問題是我沒有正確實例化圖形。我在UnitTests中出錯 – benhal