用智能指针实现一个简单的单向链表
Implementing a simple singly linked list with smart pointers
你好我正在尝试使用智能指针实现一个简单的单链表,这是我目前所拥有的,我选择使用 C++ 的 shared_ptr 但我读到 unique_ptr 会更适合这种情况,但是,我真的不知道您将如何遍历列表(即 currentNode = currentNode->next)以到达列表的末尾,以便使用 [=19= 插入元素].这是我到目前为止的代码:
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?谢谢!
您的 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);
你好我正在尝试使用智能指针实现一个简单的单链表,这是我目前所拥有的,我选择使用 C++ 的 shared_ptr 但我读到 unique_ptr 会更适合这种情况,但是,我真的不知道您将如何遍历列表(即 currentNode = currentNode->next)以到达列表的末尾,以便使用 [=19= 插入元素].这是我到目前为止的代码:
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?谢谢!
您的 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);