BGL:使用捆绑的属性来存储另一个顶点的顶点描述符(BGL: Using bundled prope

2019-10-21 00:37发布

我试图用建立一个树形图boost::adjacency list和绑定属性来存储父的每个顶点,我想顶点描述存储的方式,他们不会在无效的情况下我删除一个顶点,所以我用boost::listS ,代码应该是这个样子

// custom vertex for tree graphs
struct tree_vertex_info{
    // descriptor of parent vertex
    boost::graph_traits<Tree>::vertex_descriptor parent_in_tree;
};
// the tree graph type
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS
        tree_vertex_info, boost::no_property, graph_info> Tree;

但是,这是行不通的,因为树必须在结构定义之后被定义。 是否有任何其他方式捆绑性做呢? 我以为我可以使用int变量,而不是vertex_descriptor的类型来存储vertex_descriptors但因为我使用boost::listS存储它们,我不知道是否可以。

Answer 1:

从理论上说,你可以有这样的事情:

struct tree_vertex_info;  // forward-declaration

typedef boost::adjacency_list<
  boost::listS, boost::listS, boost::directedS, 
  tree_vertex_info, boost::no_property, graph_info> Tree;

struct tree_vertex_info {
  boost::graph_traits<Tree>::vertex_descriptor parent_in_tree;
};

然而,这将需要boost::adjacency_list类模板支撑不完全类型 (这是什么tree_vertex_info是虽然只有一个前瞻性声明,直到达到编译它的完整的声明)。 据我所知, boost::adjacency_list类不支持不完全类型(我知道,实施了不少,而且我不认为它会工作),它肯定是不保证支持他们。

其实我工作的一个新版本boost::adjacency_list我称之为boost::adjacency_list_BC ,因为它是基于Boost.Container容器,它支持不完全类型。 但是,它仍然是一种处于测试阶段(遵循这里或点击这里 ),和Boost.Container的最新版本似乎已经破碎的东西,我还需要弄清楚。 顺便说一句,我也有树木数量BGL树数据结构以及新的BGL概念和特征的(因为你似乎是实现一种树)。

此外,如果你对这个动机是你真的是有(下称“父母在树”),那么你就应该使用boost::bidirectionalS在你adjacency_list能够从孩子顶点到其父得到(这是什么样boost::bidirectionalS手段,你会得到一个双向图BidirectionalGraph )。

最后,要真正解决这个情况下,你是,你必须使用类型擦除技术。 一个简单的现成的现成办法做到这一点是使用boost::any抹去vertex_descriptor的类型,就像这样:

struct tree_vertex_info{
  // descriptor of parent vertex
  boost::any parent_in_tree;
};

// the tree graph type
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS
        tree_vertex_info, boost::no_property, graph_info> Tree;

只是仰望Boost.Any有关使用它的说明。

我以为我可以使用int变量,而不是vertex_descriptor的类型来存储vertex_descriptors但因为我使用列表来存储它们,我不知道是否可以。

你不能。 你可以不依赖于vertex_descriptor的类型是特别(例如,你不能假定它是一个整数类型,更不用说“INT”)任何东西。 我碰巧知道vertex_descriptor的通常或者是一个迭代器类型(例如, std::list<T>::iterator )或尺寸型(如std::size_tstd::vector<T>::size_type ),但是这是一个实现细节,你不应该,不能依靠。



文章来源: BGL: Using bundled properties to store vertex descriptor of another vertex