我正在编写二进制搜索树的实现。我对shared_ptr感到非常满意,但是我花了一些时间使用unique_ptr对它进行编码。我不得不关心不让这个函数拥有对象的所有权,这让我觉得很难。
使用shared_ptr,我编写了以下代码。
#include <iostream>
#include <memory>
template<class T>
class BinarySearchTree{
struct Node;
typedef std::shared_ptr<Node> nodePtr;
struct Node{
T data;
nodePtr left;
nodePtr right;
Node(const T & value):data(value),left(nullptr),right(nullptr){}
};
nodePtr root;
bool insert(nodePtr node);
void print(const nodePtr) const ;
public:
BinarySearchTree();
void insert( const T & node);
void print()const;
};
template<class T>
BinarySearchTree<T>::BinarySearchTree():root(nullptr){}
template<class T>
void BinarySearchTree<T>::insert(const T & ref)
{
Node *node = new Node(ref);
if (root==nullptr)
{
root.reset(node);
}
else
{
nodePtr temp = root;
nodePtr prev = root;
while (temp)
{
prev = temp;
if (temp->data < ref)
temp = temp->right;
else
temp = temp->left;
}
if (prev->data < ref)
prev->right.reset(node);
else
prev->left.reset(node);
}
}
template<class T>
void BinarySearchTree<T>::print()const
{
print(root);
}
template<class T>
void BinarySearchTree<T>::print(const nodePtr node)const
{
if (node==nullptr)
return;
print(node->left);
std::cout << node->data<< std::endl;
print(node->right);
}
int main()
{
BinarySearchTree<int> bst;
bst.insert(13);
bst.insert(3);
bst.insert(5);
bst.insert(31);
bst.print();
return 0;
}
现在我到处读到使用shared_ptr,其中unique_ptr足够是一种过度杀伤(因为显而易见的原因),但我该如何决定何时使用unique_ptr?就像在这种情况下,你会从第一个位置使用unique_ptr吗?