我正在嘗試使用智能指標實作二叉搜索樹,并且我讀到推薦的實作方法是使用 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;
};
有一個unique_ptr<TreeNode<T>> root指向根。
現在,如果我理解正確,unique_ptr's則無法復制或分配它,并且他們擁有該物件的唯一所有權。
因此,如果我想遍歷樹,我無法執行諸如將 a 初始化std::unique_ptr<TreeNode<T>> temp為根并從那里遍歷每個節點之類的操作,因為一旦我嘗試將rootwhich is aunique_ptr設定為temp.
那么我是否需要使用原始指標型別TreeNode*來遍歷樹并執行操作?這樣做好還是安全?對于我在這棵樹上的所有操作,我是否必須使用原始指標?
另一個問題是洗掉節點。如果我說要洗掉具有值的節點3。如果我初始化一個原始型別的指標TreeNode* temp并到達Treenode 3. 那么如果我呼叫 delete(temp) 會發生什么?一個unique_ptrfromTreeNode 2指向TreeNode 3。這個指標會發生什么?
uj5u.com熱心網友回復:
那么如果我呼叫 delete(temp) 會發生什么?
在TreeNode將被銷毀。注意delete不需要括號
unique_ptr來自TreeNode2 的A指向TreeNode3。這個指標會發生什么?
指標變為無效,并且unique_ptr要銷毀的物件是未定義的行為,因為它將嘗試delete指向無效的指標。
那么我是否需要使用 TreeNode* 型別的原始指標來遍歷樹并執行操作?這樣做好還是安全?對于我在這棵樹上的所有操作,我是否必須使用原始指標?
你可以有一個指向 a 的參考(或指標)std::unique_ptr,你不需要復制它。
delete您可以呼叫 的reset成員函式unique_ptr來釋放指向的物件,而不是原始指標TreeNode
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360374.html
上一篇:C函式不修改傳遞的陣列
下一篇:使用memcpy復制地址的記憶體
