使用shared_ptr的单链表

时间:2014-09-01 08:54:39

标签: c++11 linked-list shared-ptr

我试图使用share_ptr实现单链表。这是实施...... 以下是节点类......

template<typename T>
class Node
{
public:
    T value;
    shared_ptr<Node<T>> next;
    Node() : value(0), next(nullptr){};
    Node(T value) : value(value), next(nullptr){};
    ~Node() { cout << "In Destructor: " << value << endl; };
};

以下是链表类......

template<typename T>
class LinkedList
{
private:
    size_t m_size;
    shared_ptr<Node<T>> head;
    shared_ptr<Node<T>> tail;
public:
    LinkedList() : m_size(0), head(nullptr) {};
    void push_front(T value)
    {
        shared_ptr<Node<T>> temp = head;
        head = make_shared<Node<T>>(Node<T>(value));

        head->next = temp;
        m_size++;

        if (m_size == 1)
            tail = head;
    }
    void pop_front()
    {
        if (m_size != 0)
        {
            // Here I am having doubt------------------------!!!
            //shared_ptr<Node<T>> temp = head;
            head = head->next;
            m_size--;
            if (m_size == 0)
                tail = nullptr;
        }
    }
    bool empty()
    {
        return (m_size == 0) ? true : false;
    }
    T front()
    {
        if (m_size != 0)
            return head->value;
    }
};

我的问题是,我是否正确使用shared_ptr来分配节点?如果没有,我应该如何使用shared_ptr进行分配,以及如何删除pop_front方法中的节点?

1 个答案:

答案 0 :(得分:4)

我相信这属于code review

最重要的是:您为什么使用shared_ptrshared_ptr表示对象的所有权不明确。链表不是这种情况:每个节点都拥有下一个节点。您可以使用更简单,更有效的unique_ptr来表达这一点。

pop_front似乎运作正常。在空列表中使用pop_front时,您可以考虑抛出异常或断言而不是什么都不做。

front更有问题。如果列表为空,则很可能会获得垃圾对象。

tail有什么意义?它似乎没有被用于任何东西,因为你不能倒退,没有真正意义上的尾巴。

make_shared<Node<T>>(Node<T>(value))应该是make_shared<Node<T>>(value)make_shared<Node<T>>(value)使用Node作为构造函数的参数创建valuemake_shared<Node<T>>(Node<T>(value))创建一个Node,其中value作为参数,然后创建一个新的Node,其中包含临时Node作为参数,然后销毁第一个Node }。

您缺少副本并移动构造函数和赋值以及移动赋值运算符。

对列表实施感到满意后,请考虑使用std::forward_list