使用 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方法中的节点?

我相信

这属于代码审查。

最重要的是:你为什么要使用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)使用 value 作为构造函数的参数创建一个Nodemake_shared<Node<T>>(Node<T>(value))创建一个以 value 作为参数的Node,然后创建一个以临时Node作为参数的新Node,然后销毁第一个Node

您缺少复制和移动构造函数以及赋值和移动赋值运算符。

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

相关内容

  • 没有找到相关文章