使用唯一指针的链表不会像我预期的那样 运行
Linked list using unique pointers won't run as I expected
我正在尝试使用唯一指针实现一个链表,我已经在 c 中做了数百万次,但似乎我无法让它工作!这个问题可能依赖于使用唯一指针,但我不确定为什么。
在下面的代码中,您会注意到两件事。一个 class Node 包含列表中每个元素的数据和一个 class LinkedList 实现的行为列表。
#include <iostream>
#include <memory>
using namespace std;
class Node
{
//Private variables.
private:
std::unique_ptr<Node> next; //Next node.
std::unique_ptr<Node> prev; //Previous node.
//Int value.
int value;
//Public variables.
public:
//Constructor.
Node(int v)
:next(nullptr), prev(nullptr), value(v)
{
}
//Set next node.
void set_next(std::unique_ptr<Node> new_node)
{
next = std::move(new_node);
}
//Set previous node.
void set_prev(std::unique_ptr<Node> new_node)
{
prev = std::move(new_node);
}
//Set value.
void set_value(int v)
{
value = v;
}
//Get next node.
std::unique_ptr<Node> get_next()
{
return std::move(next);
}
//Get previous node.
std::unique_ptr<Node> get_prev()
{
return std::move(prev);
}
//Get value.
int get_value()
{
return value;
}
};
class LinkedList
{
//Private variables.
private:
std::unique_ptr<Node> head;
std::unique_ptr<Node> tail;
//Public variables.
public:
//Constructor.
LinkedList()
:head(nullptr), tail(nullptr)
{
}
//Append a item to the list.
void append(int v)
{
//Creating a new node.
std::unique_ptr<Node> new_node( new Node(v) );
//If this is the very first node.
if (head == nullptr || tail == nullptr)
{
head = std::move(new_node);
tail = std::move(new_node);
}
//Append.
else
{
tail -> set_next( std::move(new_node) ); //Linking the new node.
new_node -> set_prev( std::move(tail) ); //Set the previous.
tail = std::move(new_node); //Update the tail.
}
}
//Print all the elements.
void print()
{
//Starting node.
std::unique_ptr<Node>curr = std::move(head);
//While Loop.
while(curr != nullptr)
{
cout << curr -> get_value() << endl;
curr = std::move( curr -> get_next() );
}
}
};
int main()
{
LinkedList myList;
myList.append(1);
myList.append(2);
myList.append(3);
myList.append(4);
myList.print();
return 0;
}
输出应该是 1,2,3,4 但实际上只有 4!
我做了调试,我发现了以下语句
是运行宁4次:
//If this is the very first node.
if (head == nullptr || tail == nullptr)
{
head = std::move(new_node);
tail = std::move(new_node);
}
但是为什么呢?第一次,head 和 tail 将为空
但在那之后他们会指向某个地方所以这个声明永远不应该
再次运行。
std::unique_ptr
的一个基本 属性 是只有一个 std::unique_ptr
可以同时拥有给定的指针。这恰好是 "unique" 部分的全部内容。
std::unique_ptr<Node> new_node( new Node(v) );
好的。到目前为止一切顺利。
head = std::move(new_node);
tail = std::move(new_node);
那是你的问题。您正在尝试将相同的 std::unique_ptr
移动到另外两个。那行不通的。只有其中一个可以拥有一个指针。
将所有 std::unique_ptr
替换为 std::shared_ptr
。
我正在尝试使用唯一指针实现一个链表,我已经在 c 中做了数百万次,但似乎我无法让它工作!这个问题可能依赖于使用唯一指针,但我不确定为什么。
在下面的代码中,您会注意到两件事。一个 class Node 包含列表中每个元素的数据和一个 class LinkedList 实现的行为列表。
#include <iostream>
#include <memory>
using namespace std;
class Node
{
//Private variables.
private:
std::unique_ptr<Node> next; //Next node.
std::unique_ptr<Node> prev; //Previous node.
//Int value.
int value;
//Public variables.
public:
//Constructor.
Node(int v)
:next(nullptr), prev(nullptr), value(v)
{
}
//Set next node.
void set_next(std::unique_ptr<Node> new_node)
{
next = std::move(new_node);
}
//Set previous node.
void set_prev(std::unique_ptr<Node> new_node)
{
prev = std::move(new_node);
}
//Set value.
void set_value(int v)
{
value = v;
}
//Get next node.
std::unique_ptr<Node> get_next()
{
return std::move(next);
}
//Get previous node.
std::unique_ptr<Node> get_prev()
{
return std::move(prev);
}
//Get value.
int get_value()
{
return value;
}
};
class LinkedList
{
//Private variables.
private:
std::unique_ptr<Node> head;
std::unique_ptr<Node> tail;
//Public variables.
public:
//Constructor.
LinkedList()
:head(nullptr), tail(nullptr)
{
}
//Append a item to the list.
void append(int v)
{
//Creating a new node.
std::unique_ptr<Node> new_node( new Node(v) );
//If this is the very first node.
if (head == nullptr || tail == nullptr)
{
head = std::move(new_node);
tail = std::move(new_node);
}
//Append.
else
{
tail -> set_next( std::move(new_node) ); //Linking the new node.
new_node -> set_prev( std::move(tail) ); //Set the previous.
tail = std::move(new_node); //Update the tail.
}
}
//Print all the elements.
void print()
{
//Starting node.
std::unique_ptr<Node>curr = std::move(head);
//While Loop.
while(curr != nullptr)
{
cout << curr -> get_value() << endl;
curr = std::move( curr -> get_next() );
}
}
};
int main()
{
LinkedList myList;
myList.append(1);
myList.append(2);
myList.append(3);
myList.append(4);
myList.print();
return 0;
}
输出应该是 1,2,3,4 但实际上只有 4! 我做了调试,我发现了以下语句 是运行宁4次:
//If this is the very first node.
if (head == nullptr || tail == nullptr)
{
head = std::move(new_node);
tail = std::move(new_node);
}
但是为什么呢?第一次,head 和 tail 将为空 但在那之后他们会指向某个地方所以这个声明永远不应该 再次运行。
std::unique_ptr
的一个基本 属性 是只有一个 std::unique_ptr
可以同时拥有给定的指针。这恰好是 "unique" 部分的全部内容。
std::unique_ptr<Node> new_node( new Node(v) );
好的。到目前为止一切顺利。
head = std::move(new_node);
tail = std::move(new_node);
那是你的问题。您正在尝试将相同的 std::unique_ptr
移动到另外两个。那行不通的。只有其中一个可以拥有一个指针。
将所有 std::unique_ptr
替换为 std::shared_ptr
。