我试图用建立一个树形图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
存储它们,我不知道是否可以。
从理论上说,你可以有这样的事情:
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_t
或std::vector<T>::size_type
),但是这是一个实现细节,你不应该,不能依靠。