2013-05-30 37 views
2

我正在嘗試構建一個頂點存儲在std::list而不是std::vector中的圖。增強圖庫:std :: list作爲VertexList模板參數

但是我很困惑我得到的編譯錯誤。我用最少的代碼是

#include <boost/graph/adjacency_list.hpp> 

using namespace boost; 

int main() { 

    typedef adjacency_list< listS,listS > Graph; 

    Graph g; 

    add_edge(0,1,g); 

    return 0; 
} 

gcc-4.7.3編譯我收到以下錯誤:

/Users/matteo/Documents/workspace/graph-gravity-dec/src/test.cpp: In function 'int main()': 
/Users/matteo/Documents/workspace/graph-gravity-dec/src/test.cpp:12:17: error: invalid conversion from 'int' to 'boost::detail::adj_list_gen<boost::adjacency_list<boost::listS, boost::listS>, boost::listS, boost::listS, boost::directedS, boost::no_property, boost::no_property, boost::no_property, boost::listS>::config::vertex_descriptor {aka void*}' [-fpermissive] 
In file included from /opt/local/include/boost/graph/adjacency_list.hpp:246:0, 
      from /Users/matteo/Documents/workspace/graph-gravity-dec/src/test.cpp:2: 
/opt/local/include/boost/graph/detail/adjacency_list.hpp:681:5: error: initializing argument 2 of 'std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, boost::directed_graph_helper<Config>&) [with Config = boost::detail::adj_list_gen<boost::adjacency_list<boost::listS, boost::listS>, boost::listS, boost::listS, boost::directedS, boost::no_property, boost::no_property, boost::no_property, boost::listS>::config; typename Config::edge_descriptor = boost::detail::edge_desc_impl<boost::directed_tag, void*>; typename Config::vertex_descriptor = void*]' [-fpermissive] 

那似乎抱怨無效的轉換,從intvoid*

但是如果我改變listSvecS一切正常

#include <boost/graph/adjacency_list.hpp> 

using namespace boost; 

int main() { 

    typedef adjacency_list< listS, vecS > Graph; 

    Graph g; 

    add_edge(0,1,g); 

    return 0; 
} 

我缺少什麼?沒有進一步修改代碼的其餘部分,頂點容器是否應該可以互換?

+0

我看到他們之間沒有什麼可交換的原因:'vector'是隨機存取,而'list'不是。可能存在一個非隨機訪問接口,可讓您填充邊緣,或者庫可能需要隨機訪問... – Yakk

+1

如果您使用'listS'作爲頂點列表,則不能通過索引將頂點傳遞給'add_edge'。 – riv

回答

4

正如人們所說的,對於列表支持圖中的節點,不能使用0或1。這將工作:

typedef adjacency_list< listS,listS > Graph; 
Graph g; 
typedef boost::graph_traits <Graph>::vertex_descriptor Vertex; 
Vertex v0 = boost::add_vertex(g); 
Vertex v1 = boost::add_vertex(g); 
boost::add_edge(v0, v1, g); 

您需要創建一個頂點來添加。 this question