gpt4 book ai didi

c++ - Linked list operator= 当移动赋值时,所有元素都被移动

转载 作者:行者123 更新时间:2023-11-30 05:07:41 24 4
gpt4 key购买 nike

我正在尝试用 C++ 编写 Lined 列表,但一些测试失败了。

其中一个说:

GivenNonEmptyCollection_WhenMoveAssigning_ThenAllElementsAreMoved

第二个:

GivenNonEmptyCollection_WhenMovingToOther_ThenAllItemsAreMoved

这是我如何实现 operator=

LinkedList& operator=(const LinkedList& other)
{
if(this!=&other)
{

while (!isEmpty())
erase(begin());
for (auto it = other.begin(); it != other.end(); it++)
append(*it);
}
return *this;}

第二个:

 LinkedList& operator=(LinkedList&& other)
{
/* SELF ASSIGNMENT CHECK */
if(this!=&other)
{
while (!isEmpty())
erase(begin());
while (!other.isEmpty())
{
append(*(other.begin()));
other.erase(other.begin());
}
}
return *this;
}

这里是关于类链表和结构节点的一些东西:

template <typename Type>
class LinkedList
{
struct Node
{
Node* prev;
Node* next;
Type* data;
Node()
{
data = nullptr;
prev = nullptr;
next = nullptr;
}
Node(const Type val)
{
data = new Type(val);
prev = nullptr;
next = nullptr;
}
~Node()
{
prev = nullptr;
next = nullptr;
delete data;
}
};


private:
Node *head;
Node *tail;
size_type length;

public:

LinkedList(): head(nullptr), tail(nullptr), length(0)
{
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}


(...)

我不知道这有什么问题。

最佳答案

您正在复制和删除原始列表,但您应该移动它。
在这种情况下,这意味着从另一个列表中“窃取”数据。

它应该看起来更像这样:

LinkedList& operator=(LinkedList&& other)
{
if(this!=&other)
{
// Assuming the existence of 'LinkedList::clear', which empties the list.
// Replace with the name you chose for that function.
clear();
head = other.head;
other.head = nullptr;
tail = other.tail;
other.tail = nullptr;
length = other.length;
other.length = 0;
}
return *this;
}

并且您的移动构造函数应该进行类似的更改。

关于c++ - Linked list operator= 当移动赋值时,所有元素都被移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47205206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com