我试图使用 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_ptr
? shared_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
作为构造函数的参数创建一个Node
。 make_shared<Node<T>>(Node<T>(value))
创建一个以 value
作为参数的Node
,然后创建一个以临时Node
作为参数的新Node
,然后销毁第一个Node
。
您缺少复制和移动构造函数以及赋值和移动赋值运算符。
对列表实现感到满意后,请考虑改用std::forward_list
。