我试图使用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
方法中的节点?
答案 0 :(得分:4)
我相信这属于code review。
最重要的是:您为什么使用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)
使用Node
作为构造函数的参数创建value
。 make_shared<Node<T>>(Node<T>(value))
创建一个Node
,其中value
作为参数,然后创建一个新的Node
,其中包含临时Node
作为参数,然后销毁第一个Node
}。
您缺少副本并移动构造函数和赋值以及移动赋值运算符。
对列表实施感到满意后,请考虑使用std::forward_list
。