使用智能指针实现一个简单的单链表

时间:2015-01-02 09:59:29

标签: c++ linked-list shared-ptr smart-pointers unique-ptr

您好我正在尝试使用智能指针实现一个简单的单链表,这是我到目前为止,我选择使用C ++的shared_ptr,但我读到unique_ptr更适合这种情况但是,我不喜欢我真的知道如何迭代列表(即currentNode = currentNode-> next)以到达列表的末尾以便使用unique_ptr插入元素。这是我到目前为止的代码:

template <typename T>
class LinkedList;

template <typename T>
class ListNode
{
public:
    ListNode() : _data(T()) {}
    explicit ListNode(const T& value) : _data(value) {}

    friend class LinkedList < T > ;
private:
    T _data;
    shared_ptr<ListNode<T>> _next;
};

template <typename T>
class LinkedList
{
public:
    void push_back(const T& value)
    {
        if (_root)
        {
            shared_ptr<ListNode<T>> currentNode(_root);

            while (currentNode->_next != nullptr)
            {
                currentNode = currentNode->_next;
            }

            currentNode->_next = make_shared<ListNode<T>>(value);
        }
        else
        {
            // If the list is completely empty,
            // construct a new root (first element)
            _root = make_shared<ListNode<T>>(value);
        }
    }

    void print() const
    {
        shared_ptr<ListNode<T>> currentNode(_root);

        while (currentNode != nullptr)
        {
            cout << currentNode->_data << " ";
            currentNode = currentNode->_next;
        }

        cout << endl;
    }
private:
    shared_ptr<ListNode<T>> _root;
};

如果使用unique_ptrs是更好的方法,那么你能说明一下如何解决迭代问题吗?由于无法分配unique_ptrs,我将如何执行代码块:

shared_ptr<ListNode<T>> currentNode(_root);

while (currentNode->_next != nullptr)
{
    currentNode = currentNode->_next;
}

currentNode->_next = make_shared<ListNode<T>>(value);

使用unique_ptrs而不是shared_ptrs?谢谢!

1 个答案:

答案 0 :(得分:4)

std::unique_ptr的循环可能如下所示:

// Iteration doesn't own resource, so no unique_ptr here.
ListNode<T>* currentNode(_root.get());

while (currentNode->_next != nullptr)
{
    currentNode = currentNode->_next.get();
}

currentNode->_next = make_unique<ListNode<T>>(value);