STL源码剖析(侯捷版本) —— 第四章 序列式容器(三)

ops/2024/12/27 19:41:30/

传送门

STL源码剖析(侯捷版本) —— 第一章 STL 概论与版本简介
STL源码剖析(侯捷版本) —— 第二章 空間配置器 allocator
STL源码剖析(侯捷版本) —— 第三章 迭代器(Iterators)与Traits编程技巧在C++ STL中的应用

STL源码剖析(侯捷版本) —— 第四章 序列式容器(一)
STL源码剖析(侯捷版本) —— 第四章 序列式容器(二)
STL源码剖析(侯捷版本) —— 第四章 序列式容器(三)
STL源码剖析(侯捷版本) —— 第四章 序列式容器(四)
STL源码剖析(侯捷版本) —— 第四章 序列式容器(五)

文章目录

  • SGI STL 的 `list`
    • 1. `list` 的节点 (`node`)
      • 双向链表的基本结构
      • 节点的实现
    • 2. `list` 的迭代器
      • 迭代器基类
      • 前移与后移
      • 比较操作
    • 3. `list` 的数据结构
      • `list` 的基类
      • 构造与析构
      • 空间管理
    • 4. 特点总结

SGI STL 的 list

在 SGI STL 中,list 是一个环状双向链表,支持在任意位置进行高效的插入和删除操作。这些操作的时间复杂度为常数时间。


1. list 的节点 (node)

双向链表的基本结构

list 的底层是由一个节点结构组成的双向链表:

struct _List_node_base {_List_node_base* _M_next;_List_node_base* _M_prev;
};

每个节点通过 _M_next_M_prev 指针连接,构成链表。

节点的实现

每个 list 节点存储链表的值:

template <class _Tp>
struct _List_node : public _List_node_base {_Tp _M_data; // 节点存储的值
};

2. list 的迭代器

由于 list 的节点在内存中不连续存储,迭代器需要具备前移后移的能力。因此,list 提供了双向迭代器Bidirectional iterator)。

迭代器基类

struct _List_iterator_base {typedef size_t                     size_type;typedef ptrdiff_t                  difference_type;typedef bidirectional_iterator_tag iterator_category; // 双向迭代器标签_List_node_base* _M_node; // 指向节点的指针
};

前移与后移

void _M_incr() { _M_node = _M_node->_M_next; } // 前移
void _M_decr() { _M_node = _M_node->_M_prev; } // 后移

比较操作

bool operator==(const _List_iterator_base& __x) const {return _M_node == __x._M_node;
}
bool operator!=(const _List_iterator_base& __x) const {return _M_node != __x._M_node;
}

3. list 的数据结构

list 的数据结构是一个环状的双向链表,遵循 STL 的前闭后开原则。

list 的基类

template <class _Tp, class _Alloc>
class _List_base {
public:typedef _Alloc allocator_type;allocator_type get_allocator() const { return allocator_type(); }

构造与析构

构造函数会初始化一个空白节点用于标记链表的尾部:

  _List_base(const allocator_type&) {_M_node = _M_get_node();_M_node->_M_next = _M_node;_M_node->_M_prev = _M_node;}

析构函数会清空链表并释放节点:

 _List_base(const allocator_type&) {_M_node = _M_get_node();_M_node->_M_next = _M_node;_M_node->_M_prev = _M_node;}

空间管理

list 使用专属的空间配置器管理节点内存:

protected:typedef simple_alloc<_List_node<_Tp>, _Alloc> _Alloc_type;_List_node<_Tp>* _M_get_node() {return _Alloc_type::allocate(1); // 分配一个节点}void _M_put_node(_List_node<_Tp>* __p) {_Alloc_type::deallocate(__p, 1); // 释放一个节点}
};

4. 特点总结

  • list 的底层是一个环状双向链表
  • 节点使用 _M_next_M_prev 连接,形成环状结构。
  • 默认有一个尾端的空白节点,用于支持 STL 的前闭后开原则。
  • 插入与删除操作时间复杂度为常数时间。
  • 提供双向迭代器支持前移和后移操作。

http://www.ppmy.cn/ops/145465.html

相关文章

1847. 最近的房间

1847. 最近的房间 题目链接&#xff1a;1847. 最近的房间 代码如下&#xff1a; class Solution { public:vector<int> closestRoom(vector<vector<int>>& rooms, vector<vector<int>>& queries){sort(rooms.begin(), rooms.end(), […

Ubuntu系统下 npm install -g tauri 报错问题处理

处理在安装 Tauri 时遇到的问题&#xff0c;可以按照以下步骤进行操作 npm install -g taurinpm warn deprecated inflight1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async …

ChatGPT与Postman协作完成接口测试(三)

如果想要完善接口测试用例&#xff0c;可以依据笔者前面使用的方法&#xff0c;让ChatGPT继续完善测试用例&#xff0c;如关键字过长、特殊字符等接口测试用例。限于篇幅&#xff0c;这里不考虑这些内容。S_PM_WebTours.json文件就是最终的Postman接口测试用例脚本。 接下来笔者…

unity使用代码在动画片段中添加event

unity使用代码在动画片段中添加event using UnityEngine;public static class AnimationHelper {/// <summary>/// 获取Animator状态对应的动画片段/// </summary>/// <param name"animator">Animator组件</param>/// <param name"…

系统分析师第二版口诀

【绪 数 计 网 库】、【信 工 项 安 规 】、【需 架 设 测 运】、【We 嵌 移 大 微 物 论】&#xff08;第1章 绪论、第2章 数学与工程基础、第3章 计算机系统、第4章 计算机网络与分布式系统、第5章 数据库系统、第6章 企业信息化、第7章 软件工程、第8章 项目管理、第9章 信息…

NLP基础知识 - 向量化

NLP基础知识 - 向量化 目录 NLP基础知识 - 向量化 NLP基础知识 - 向量化目录什么是向量化&#xff1f;为什么需要向量化&#xff1f;常见的向量化方法1. 词袋模型&#xff08;Bag of Words, BoW&#xff09;2. TF-IDF&#xff08;词频-逆文档频率&#xff09;3. 词嵌入&#x…

python EEGPT报错:Cannot cast ufunc ‘clip‘ output from dtype(‘float64‘)

今天在运行EEGPT的时候遇见了下面的问题&#xff0c;首先是nme报错&#xff0c;然后引起了numpy的报错&#xff1a; numpy.core._exceptions._UFuncOutputCastingError: Cannot cast ufunc clip output from dtype(float64)在网上找了好久的教程&#xff0c;但是没有找到。猜测…

Python爬虫实战:按关键字搜索VIP商品详情

在电子商务的浪潮中&#xff0c;快速准确地获取商品信息成为了一项至关重要的技能。对于电商平台而言&#xff0c;能够根据用户输入的关键字搜索VIP商品并获取其详细信息&#xff0c;不仅能够提升用户体验&#xff0c;还能够增强客户忠诚度。本文将带你深入了解如何利用Python爬…