gpt4 book ai didi

c++ - 我在链表实现中对 std::shared_ptr 和 std::unique_ptr 做错了什么?

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:21 26 4
gpt4 key购买 nike

我以前从未使用过智能指针,所以我决定尝试实现一个基本的小链表,看看它是如何工作的。下面的程序只输出列表的第一个元素,即 5,然后就退出了。

print() 函数中,while 循环只迭代一次,这意味着列表只包含一个元素,即使它应该包含 3 个。

代码如下:

#include <iostream>
#include <memory>

class list {
private:
struct node {
int val;
std::shared_ptr<node> next;
node(int _val) : val(_val), next(nullptr) {}
};
std::shared_ptr<node> head;

public:
list() {
head = nullptr;
}

void push_back(int val) {
std::unique_ptr<node> new_node(new node(val));
if(head == nullptr) {
head = std::move(new_node);
} else {
std::shared_ptr<node> curr(head);
while(curr != nullptr) {
curr = curr->next;
}
curr = std::move(new_node);
}
}

void print() {
std::shared_ptr<node> curr(head);
while(curr != nullptr) {
std::cout << curr->val << " ";
curr = curr->next;
}
std::cout << std::endl;
}
};

int main() {
std::unique_ptr<list> lst(new list());

lst->push_back(5);
lst->push_back(10);
lst->print();

return 0;
}

最佳答案

您没有正确地将节点附加到末尾。这部分代码:

while(curr != nullptr) {
curr = curr->next;
}
curr = std::move(new_node);

应该改为:

while(curr->next != nullptr) {
curr = curr->next;
}
curr->next = std::move(new_node);

关于c++ - 我在链表实现中对 std::shared_ptr 和 std::unique_ptr 做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276975/

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