我通过为每个节点建立一个类来建模一般树结构,该类包含指向父级、第一个子级和第一个兄弟级的指针,以及指向最后一个兄弟级的指针(不需要,但有用)。为此,我添加了一些额外的数据。我目前的实现是:
class TreeNode {
typedef boost::shared_ptr<TreeNode> Ptr;
typedef boost::weak_ptr<TreeNode> WPtr;
WPtr p2parent; ///< pointer to the parent node (NULL in the root)
Ptr p2sibling; ///< pointer to the first sibling (or NULL)
Ptr p2child; ///< pointer to the first child (or NULL)
WPtr p2lastChild; ///< pointer to the last child (not strictly needed)
};
正如您所看到的,我对同级和子级使用shared_ptr,因此只需删除其根即可删除整个树。对于指向父级的指针,我知道我不应该使用shared_ptr,因为这会创建循环,所以我必须在weak_ptr和原始指针(TreeNode *)之间进行选择 - 有什么想法吗?
对于指向最后一个子级的(可选)指针,可以在weak_ptr、shared_ptr 和原始指针之间进行选择——为了使整个类内部一致,最好的选择是什么?
最后,我在该结构上有几个迭代器,例如深度优先迭代器 atd。迭代器应该在内部使用什么指针:原始指针、weak_ptr 还是shared_ptr?三种方法各有什么优点?
shared_ptr
完全是多余的:它是一棵树,因此没有节点的共享所有权。每个节点都有一个所有者:其父节点。
如果您使用的实现支持它,您应该使用std::unique_ptr
对于两个子指针和指向根节点的指针。如果您的实现不支持std::unique_ptr
, 您可以使用std::auto_ptr
但您需要显式地使节点类不可复制。无论哪种情况,您都可以使用原始指针作为返回父级的指针。
(请注意,无论您使用什么类型的指针,您都需要为树类编写复制构造函数和复制赋值运算符:隐式声明的指针没有正确的语义。)
迭代器只需要一个指向它所指向的元素的原始指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)