找回密码
 立即注册
查看: 339|回复: 0

[其它] 深入STL之list - 模拟实现深入理解List与迭代器

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-6-10 18:19:19 | 显示全部楼层 |阅读模式
本帖最后由 Shaw0xyz 于 2024-6-10 18:23 编辑

1. 引言

在C++编程中,STL(标准模板库)是一种强大的工具,它提供了丰富的数据结构和算法,帮助开发者高效地处理各种问题。本文将深入探讨STL中的list容器,并模拟实现一个简单的list以便更好地理解list和迭代器的工作原理。

1.1 什么是list容器

list是STL中的一个双向链表容器,它允许在任意位置进行高效的插入和删除操作,不需要像数组一样移动元素。list容器提供了丰富的成员函数和迭代器来操作链表中的元素。

2. list容器的模拟实现

在模拟实现list容器之前,我们需要了解list容器的基本特性和操作。

2.1 list容器的基本特性

(1) 双向链表:list容器是一个双向链表,每个节点包含一个数据元素和两个指针,分别指向前一个节点和后一个节点。

(2) 高效的插入和删除:由于双向链表的特性,list容器在任意位置进行插入和删除操作的时间复杂度为O(1)。

2.2 list容器的基本操作

(1) 插入操作:在指定位置插入元素。

(2) 删除操作:删除指定位置的元素。

(3) 迭代器操作:获取链表中的元素,并支持前向和后向遍历。

3. list容器的模拟实现

接下来,我们将模拟实现一个简单的list容器,包括插入、删除和迭代器操作。

3.1 定义list节点结构体

  1. struct ListNode {
  2.     int val;
  3.     ListNode* prev;
  4.     ListNode* next;
  5.     ListNode(int x) : val(x), prev(nullptr), next(nullptr) {}
  6. };
复制代码


3.2 定义list类

  1. class MyList {
  2. private:
  3.     ListNode* head;
  4.     ListNode* tail;
  5. public:
  6.     MyList() : head(nullptr), tail(nullptr) {}

  7.     // 插入操作
  8.     void insert(int val) {
  9.         ListNode* node = new ListNode(val);
  10.         if (!head) {
  11.             head = node;
  12.             tail = node;
  13.         } else {
  14.             tail->next = node;
  15.             node->prev = tail;
  16.             tail = node;
  17.         }
  18.     }

  19.     // 删除操作
  20.     void erase(int val) {
  21.         ListNode* cur = head;
  22.         while (cur) {
  23.             if (cur->val == val) {
  24.                 if (cur == head) {
  25.                     head = cur->next;
  26.                 } else if (cur == tail) {
  27.                     tail = cur->prev;
  28.                 } else {
  29.                     cur->prev->next = cur->next;
  30.                     cur->next->prev = cur->prev;
  31.                 }
  32.                 delete cur;
  33.                 return;
  34.             }
  35.             cur = cur->next;
  36.         }
  37.     }

  38.     // 迭代器操作
  39.     class iterator {
  40.     private:
  41.         ListNode* node;
  42.     public:
  43.         iterator(ListNode* n) : node(n) {}

  44.         int& operator*() {
  45.             return node->val;
  46.         }

  47.         iterator& operator++() {
  48.             node = node->next;
  49.             return *this;
  50.         }

  51.         iterator& operator--() {
  52.             node = node->prev;
  53.             return *this;
  54.         }

  55.         bool operator!=(const iterator& other) const {
  56.             return node != other.node;
  57.         }
  58.     };

  59.     iterator begin() {
  60.         return iterator(head);
  61.     }

  62.     iterator end() {
  63.         return iterator(nullptr);
  64.     }
  65. };
复制代码


4. 结论

通过模拟实现list容器,我们深入理解了list容器的工作原理和基本操作。list容器作为STL中的一个重要组件,为我们提供了高效的链表操作,可以在实际编程中大显身手。希望本文能帮助读者更好地理解list容器和迭代器的使用方式。




/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz

荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:49 , Processed in 0.062764 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表