使用std::unique ptr的二进制搜索树



我正在尝试使用智能指针实现二进制搜索树,我读到建议的实现方法是使用unique_ptr,因为父级拥有子级,并且二进制搜索树中没有多个所有者。

以这棵树为例,

10
4                      20       
2           5          11          30
3

这里4是10的左子,2是4的左子和3是2的右子,依此类推

现在结构看起来像

template<typename T>
struct TreeNode {
T data;
std::unique_ptr<TreeNode<T>> left, right; 
};

有一个指向根的CCD_ 1。

现在,如果我理解正确的话,unique_ptr's不能被复制或分配,它们对对象具有唯一的所有权。

因此,如果我想遍历树,我不能做一些事情,比如将std::unique_ptr<TreeNode<T>> temp初始化到根并遍历从那里开始的每个节点,因为一旦我尝试将root(即unique_ptr(设置为temp,它就会抛出错误。

那么,我需要使用类型为TreeNode*的原始指针来遍历树并执行操作吗?这样做好还是安全?对于我在这棵树上的所有操作,我是否必须使用原始指针?

另一个问题是删除节点。如果我说要删除值为3的节点。如果我初始化类型为TreeNode* temp的原始指针并到达unique_ptr<TreeNode<T>> root0。那么,如果我调用delete(temp(,会发生什么?来自TreeNode 2unique_ptr指向TreeNode 3。这个指针会发生什么情况?

那么如果我调用delete(temp(会发生什么?

TreeNode将被销毁。注意delete不需要括号

来自TreeNode2的unique_ptr指向TreeNode3。这个指针会发生什么情况?

指针变为无效,并且要销毁的unique_ptr对象是未定义的行为,因为它将尝试将无效指针delete

那么我需要使用TreeNode*类型的原始指针来遍历树并执行操作吗?这样做好还是安全?对于我在这棵树上的所有操作,我是否必须使用原始指针?

你可以有一个指向std::unique_ptr的引用(或指针(,你不需要复制它。

您可以调用unique_ptrreset成员函数来释放指向TreeNode的,而不是将delete作为原始指针

最新更新