1

我正在使用捆绑的属性,像这样

class cVertex { ... };
class eEdge { ... };
typedef boost::adjacency_list <
    boost::vecS, boost::vecS, boost::undirectedS,
    cVertex, cEdge  >
            graph_t;
graph_t myGraph;

这对顶点很有效。我可以编写代码来轻松访问顶点捆绑属性

const cVertex& v = myGraph[ *vertices(myGraph).first + idx ];

然而,同样的事情似乎不适用于边缘

const cEdge& e = myGraph[ *edges(myGraph).first + idx ];

我得到这些编译器错误

1>.\cGraph.cpp(109) : error C2678: binary '+' : 
no operator found which takes a left-hand operand of type 
'boost::detail::edge_desc_impl<Directed,Vertex>' 
(or there is no acceptable conversion)

我也试过这个:

对于顶点,这很好用

boost::graph_traits<graph_t>::vertex_iterator vi = vertices(myGraph).first;
vi += idx;

但这会产生编译器错误

boost::graph_traits<graph_t>::edge_iterator  ei = edges(myGraph).first;
ei += idx;

这是错误

>C:\boost\boost_1_51\boost/iterator/iterator_adaptor.hpp(330) :
error C3767: '+=': candidate function(s) not accessible
1>        could be the friend function at 'C:\boost\boost_1_51\boost/graph/topology.hpp(63)' :
'+='  [may be found via argument-dependent lookup]
4

2 回答 2

1

adjacency_list不包含图形的单个边向量,但将边存储为...邻接列表。这意味着每个顶点将自己的边存储为相邻顶点的列表。

在 boost 中还有许多其他数据结构来表示一个图,例如,edge_list这将使您的边缘可以直接访问,adjacency_matrix或者压缩的稀疏行图(用于快速和紧凑的只读访问)。

您还应该能够通过创建自定义(属性)映射来直接访问您的边缘来解决您的问题。

于 2015-05-29T21:04:00.310 回答
-1

我找到了这个解决方法

boost::graph_traits<graph_t>::edge_iterator  ei = edges(myGraph).first;

for( int k = 0; k < idx; k++ ) {
    ei++;
}

这是必要的,这似乎令人难以置信!

正如 Jeremiah Willcock 所建议的那样,这个代码可以通过编写看起来更简单

boost::graph_traits<graph_t>::edge_iterator  ei = edges(myGraph).first;
std::advance( ei, idx );

(实际上执行的代码是一样的,只是增加了迭代器是否是随机访问和函数调用本身的测试)

于 2013-06-08T17:44:08.057 回答