diff --git a/main.cpp b/main.cpp index dc25c6b..a170668 100644 --- a/main.cpp +++ b/main.cpp @@ -4,51 +4,70 @@ struct Node { // 这两个指针会造成什么问题?请修复 - std::shared_ptr next; - std::shared_ptr prev; + std::unique_ptr next; + Node *prev; // 如果能改成 unique_ptr 就更好了! int value; // 这个构造函数有什么可以改进的? - Node(int val) { - value = val; + explicit Node(int val) : value(val) { } + void insert(int val) { - auto node = std::make_shared(val); - node->next = next; + auto node = std::make_unique(val); + node->next = std::move(next); node->prev = prev; if (prev) - prev->next = node; + prev->next = std::move(node); if (next) - next->prev = node; + next->prev = node.get(); } void erase() { - if (prev) - prev->next = next; + if (prev){ + prev->next = std::move(next); + } if (next) next->prev = prev; } ~Node() { - printf("~Node()\n"); // 应输出多少次?为什么少了? + printf("~Node(%d)\n", value); // 应输出多少次?为什么少了? + // shared_ptr会导致循环引用,因此List被解析以后,Node不会被释放。 } }; struct List { - std::shared_ptr head; + std::unique_ptr head; List() = default; List(List const &other) { printf("List 被拷贝!\n"); - head = other.head; // 这是浅拷贝! + //head = other.head; // 这是浅拷贝! // 请实现拷贝构造函数为 **深拷贝** + Node *node = other.head.get(); + Node *tail = nullptr; + if(node){ + head = std::make_unique(node->value); + head->prev = nullptr; + tail = head.get(); + node = node->next.get(); + } + + while(node){ + tail->next = std::make_unique(node->value); + tail->next->prev = tail; + tail = tail->next.get(); + node = node->next.get(); + } + tail->next = nullptr; } List &operator=(List const &) = delete; // 为什么删除拷贝赋值函数也不出错? + // ={} 访问的是移动赋值函数 List(List &&) = default; List &operator=(List &&) = default; @@ -59,16 +78,16 @@ struct List { int pop_front() { int ret = head->value; - head = head->next; + head = std::move(head->next); return ret; } void push_front(int value) { - auto node = std::make_shared(value); - node->next = head; + auto node = std::make_unique(value); if (head) - head->prev = node; - head = node; + head->prev = node.get(); + node->next = std::move(head); + head = std::move(node); } Node *at(size_t index) const { @@ -80,7 +99,7 @@ struct List { } }; -void print(List lst) { // 有什么值得改进的? +void print(List const &lst) { // 有什么值得改进的? printf("["); for (auto curr = lst.front(); curr; curr = curr->next.get()) { printf(" %d", curr->value);