提示信息

C++第七讲:STL中list的使用及其模拟实现

我是透明的 已关注

在C++中,STL(标准模板库)提供了许多强大的数据结构和算法,其中std::list是一个非常常用的双向链表实现。在本讲中,我们将介绍如何使用STL中的list以及如何模拟实现一个简单的链表。

一、STL中std::list的使用

std::list是一个双向链表,这意味着你可以从链表的任意节点开始,向前或向后遍历。它的特点是插入和删除操作速度很快,特别是在任意位置进行操作时,不需要像向量那样移动其他元素。

1. 基本操作

以下是一些基本操作示例:

  1. #include <iostream>
  2. #include <list>
  3. int main() {
  4. std::list<int> myList = {1, 2, 3, 4, 5};
  5. // 遍历并输出列表
  6. for(int num : myList) {
  7. std::cout << num << " ";
  8. }
  9. std::cout << std::endl;
  10. // 在末尾添加元素
  11. myList.push_back(6);
  12. // 在开头添加元素
  13. myList.push_front(0);
  14. // 删除元素
  15. myList.pop_front(); // 删除第一个元素
  16. myList.pop_back(); // 删除最后一个元素
  17. // 插入元素
  18. auto it = myList.begin();
  19. std::advance(it, 2); // 指针向前移动两个位置
  20. myList.insert(it, 10);
  21. // 删除指定元素
  22. it = myList.begin();
  23. std::advance(it, 2);
  24. myList.erase(it);
  25. // 输出修改后的列表
  26. for(int num : myList) {
  27. std::cout << num << " ";
  28. }
  29. std::cout << std::endl;
  30. return 0;
  31. }

2. 特点

  • 支持快速的插入和删除:在任意位置插入和删除元素的操作都是常数时间O(1)
  • 不支持随机访问:由于链表的结构,访问第i个元素需要O(n)时间。
  • 双向链表:可以很容易地向前和向后遍历。

3. 常用函数

  • push_back / push_front
  • pop_back / pop_front
  • begin / end
  • empty / size
  • insert / erase

二、模拟实现简单的链表

为了更好地理解std::list的工作原理,我们可以尝试使用C++实现一个简单的双向链表。

  1. #include <iostream>
  2. struct Node {
  3. int data;
  4. Node* prev;
  5. Node* next;
  6. Node(int value) : data(value), prev(nullptr), next(nullptr) {}
  7. };
  8. class MyList {
  9. private:
  10. Node* head;
  11. Node* tail;
  12. public:
  13. MyList() : head(nullptr), tail(nullptr) {}
  14. ~MyList() {
  15. while(head) {
  16. Node* temp = head;
  17. head = head->next;
  18. delete temp;
  19. }
  20. }
  21. void push_back(int value) {
  22. Node* node = new Node(value);
  23. if (!tail) {
  24. head = tail = node;
  25. } else {
  26. tail->next = node;
  27. node->prev = tail;
  28. tail = node;
  29. }
  30. }
  31. void push_front(int value) {
  32. Node* node = new Node(value);
  33. if (!head) {
  34. head = tail = node;
  35. } else {
  36. head->prev = node;
  37. node->next = head;
  38. head = node;
  39. }
  40. }
  41. void pop_back() {
  42. if (!tail) return;
  43. Node* temp = tail;
  44. tail = tail->prev;
  45. if (tail) tail->next = nullptr;
  46. else head = nullptr;
  47. delete temp;
  48. }
  49. void pop_front() {
  50. if (!head) return;
  51. Node* temp = head;
  52. head = head->next;
  53. if (head) head->prev = nullptr;
  54. else tail = nullptr;
  55. delete temp;
  56. }
  57. void print_list() const {
  58. Node* current = head;
  59. while(current) {
  60. std::cout << current->data << " ";
  61. current = current->next;
  62. }
  63. std::cout << std::endl;
  64. }
  65. };
  66. int main() {
  67. MyList myList;
  68. myList.push_back(1);
  69. myList.push_back(2);
  70. myList.push_front(0);
  71. myList.print_list(); // 输出: 0 1 2
  72. myList.pop_front();
  73. myList.print_list(); // 输出: 1 2
  74. myList.pop_back();
  75. myList.print_list(); // 输出: 1
  76. return 0;
  77. }

总结

  • std::list是STL中用于双向链表的实现,支持快速插入和删除。
  • 不支持随机访问,适合需要频繁插入和删除的场景。
  • 可以使用节点连接的方式来模拟实现链表,加深对其内部机制的理解。
    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
我是透明的 关注 已关注

最近一次登录:2024-11-19 22:53:57   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图