尝试REALLY难以使用unique_ptr而不是shared_ptr是否有意义?

时间:2016-12-30 02:37:50

标签: c++ templates binary-search-tree

我正在编写二进制搜索树的实现。我对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吗?

0 个答案:

没有答案