STL序列式容器之list

相较于vector的连续性空间,list相对比较复杂;list内部使用了双向环形链表的方式对数据进行存储;list在增加元素时,采用了精准的方式分配一片空间对数据及附加指针等信息进行存储;

list节点定义如下

template<class T>
struct __list_node{__list_node<T>* pre;   // 此处采用了书中建议的写法;与实际定义略有差异__list_node<T>* next;T data;
};

因为list存储节点不是T,所以其迭代器不能使用T*,所以定义了其迭代器

template<class T, class Ref, class Ptr>
struct __list_iterator {// ...typedef __list_node<T> * link_type;// ...link_type node;// ...
};

__list_iterator迭代器的操作符*,->操作符比较明显为:node->data, &node->data;

对于操作符++,和--,分别对应于node=node->next,及node=node->pre;

list采用双向环形链表,list成员只包含一个节点node;

template <class T, class Alloc = alloc>
class list {protected:typedef __list_node<T> list_node;public :typedef list_node* link_type;protected:link_type node;...
};

因为是环形结构,node本身即为list的end,node->next即为list的起始节点;

iterator begin() {return node->next;}
iterator end()   {return node;}
bool empty() const {return node->next == node;}
reference front() {return *begin();}
reference back() {return *(end()--);}

list的insert操作比较简明:

iterator insert(iterator position, const T&x) {link_type tmp = create_node(x);tmp->next = position.node;tmp->pre  = position.node->pre;position.node->pre->next = tmp;position.node->pre = tmp;return tmp;    }

指针插入前后指向情况如下

​​​​​​​

此外,lsit还提供了splice及merge操作,splice用于拼接,merge是两个有序list的合并,看上去很适合归并排序当中的合并操作;

此外在书中,提到了sort函数,用的快排的代码,用到了swap及merge,没能理解,(可能是前面漏掉了部分函数的定义,没有理解算法的含义;等看到了后再补充这块的学习内容)

参考文档《STL源码剖析--侯捷》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Science Robotics 封面论文:视触觉传感器的手内操作

现在&#xff0c;随便丢给机械手一个陌生物体&#xff0c;它都可以像人类一样轻松拿捏了。除了苹果&#xff0c;罐头、乐高积木、大象玩偶、骰子&#xff0c;都不在话下&#xff1a; 这就是来自Meta FAIR团队最新的NeuralFeels技术&#xff0c;通过融合触觉和视觉&#xff0c;机…

python语言基础-5 进阶语法-5.2 装饰器-5.2.2 简单装饰器

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.2.2 简单装饰器 装饰器的形式就是一个闭包&#xff0c;下面是一个简单的定义并使用…

定时器简介

TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能&#xff0c;也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序…

【电子设计】按键LED控制与FreeRTOS

1. 安装Keilv5 打开野火资料,寻找软件包 解压后得到的信息 百度网盘 请输入提取码 提取码:gfpp 安装526或者533版本都可以 下载需要的 F1、F4、F7、H7 名字的 DFP pack 芯片包 安装完 keil 后直接双击安装 注册操作,解压注册文件夹后根据里面的图示步骤操作 打开说明 STM…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势

目录 文献基本信息 序言 1 发展概况 2 重点技术发展 2.1 人工智能技术 2.1.1 应用深化 2.1.2 作战效能提升 2.2 航空技术 2.2.1螺旋桨设计创新 2.2.2 发射回收技术进步 2.3 其他相关技术 2.3.1 远程控制技术探 2.3.2 云地控制平台应用 3 装备系统进展 3.1 无人作…

redis类型介绍

1. 字符串&#xff08;String&#xff09;&#xff1a; • 简介&#xff1a;最基础的数据类型&#xff0c;可以存储任何形式的字符串&#xff0c;包括文本数据和数字数据。 • 常用操作&#xff1a;SET、GET、INCR、DECR等。 2. 列表&#xff08;List&#xff09;&#xff1a; …

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点&#xff0c;博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体&#xff0c;Blog站点所形成的网状结构促成了不同于以往社区的Blog文化&#xff0c;Blog技术缔造了“博客”文化。本文课题研究的“…

家政服务小程序,家政行业数字化发展下的优势

今年以来&#xff0c;家政市场需求持续增长&#xff0c;市场规模达到了万亿级别&#xff0c;家政服务行业成为了热门行业之一&#xff01; 家政服务种类目前逐渐呈现了多样化&#xff0c;月嫂、保姆、做饭保洁、收纳、维修等家政种类不断出现&#xff0c;满足了居民日益增长的…

炼码LintCode--数据库题库(级别:简单;数量:55道)--刷题笔记_02

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;简单&#xff1b;数量&#xff1a;55道&#xff09;--刷题笔记_023618 耗时前三的任务&#xff08;日期差&#xff09;题&#xff1a;sql&#xff1a;解释&#xff1a;DATEDIFF 天数差order by 别名TIMESTAMPDIFF 月…

正则表达式那些事儿

目录 1.正则表达式中的模糊匹配符1.1点"."1.2星号"*"1.3问号"?"1.4 d 当处理文本需要匹配特定的字符串的时候&#xff0c;我们需要使用正则表达式。 1.正则表达式中的模糊匹配符 有很多字符是正则表达式中的特殊用途字符&#xff0c;不能直接用…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址&#xff0c;每个域名由多个标签&#xff08;label&#xff09;组成&#xff0c;标签之间用点 . 分隔。域名规则有很多细节&#xff0c;但基本要求是&#xff1a…

猫狗识别之BUG汇总

一、github登不上去问题 下载watt toolkit 下载地址&#xff1a;https://steampp.net/ 可以下载后加速&#xff0c;访问github 二、猫狗总体参考核心 B哥的博客 https://github.com/bubbliiiing/classification-keras?tabreadme-ov-file 三、CSDN很多会员才能阅读问题 根据…

Failed to create a temp file - Jenkins 无法创建任务

近日&#xff0c;突然发现任务集群的jenkins异常退出了&#xff0c;没有任何的迹象。后来排查到jenkins的job的日志后&#xff0c;找到了以下错误日志。 Started by user unknown or anonymous Running as SYSTEM Building in workspace /Users/xxxxx/work/jenkins2/jenkins_h…

【C++】list 与 string 基础与实现字符串操作

【C】使用 list 与 string 实现基础字符串操作 文章目录 一、字符串的基础操作1.1 - startsWith1.2 - endsWith1.3 - trim1.4 - indexOf1.5 - replaceAll 二、list 基础操作2.1 - 遍历2.1.1 - 使用迭代器访问2.1.2 - 使用基于范围的 for 循环遍历2.1.3 - 使用标准算法库遍历 2.…

CI/CD认识

CI/CD 是 Continuous Integration&#xff08;持续集成&#xff09; 和 Continuous Delivery/Deployment&#xff08;持续交付/部署&#xff09; 的缩写&#xff0c;是一种软件开发和运维实践&#xff0c;旨在通过自动化和持续迭代来提高开发效率、代码质量以及交付速度。 CI&…

Git主干分支master开发优缺点

优缺点 主干开发&#xff1a;是指开发人员直接向主干&#xff08;习惯上主干分支通常为&#xff1a;main或master&#xff09;提交/推送代码。通常开发团队的成员1天至少一次地将代码提交到主干分支&#xff0c;在到达发布条件时&#xff0c;从主干拉出发布分支通常为&#xf…

药典新篇:Spring Boot助力中药实验管理

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中药实验管理系统的相关信息成为必然。开发…

使用 Python 和 Py2Neo 构建 Neo4j 管理脚本

Neo4j 是一个强大的图数据库&#xff0c;适合处理复杂的关系型数据。借助 Python 的 py2neo 库&#xff0c;我们可以快速实现对 Neo4j 数据库的管理和操作。本文介绍一个功能丰富的 Python 脚本&#xff0c;帮助用户轻松管理 Neo4j 数据库&#xff0c;包含启动/停止服务、清空数…

举例通俗易懂地理解数据结构

以下是几个数据结构的基础讲解&#xff1a; 1. 数组 (Array) 数组是最简单、最常用的数据结构。它在内存中分配一块连续的空间&#xff0c;并且所有元素的类型相同。 C语言示例&#xff1a; #include <stdio.h>int main() {int arr[5] {10, 20, 30, 40, 50};// 访问数…

Apache Doris:深度优化与最佳实践

引言 在前两篇文章中&#xff0c;我们已经介绍了 Apache Doris 的基本概念、安装配置、基础操作以及一些高级特性。本文将进一步深入探讨 Doris 的性能优化技巧、高级查询优化、数据建模最佳实践以及常见问题的解决方法。通过本文&#xff0c;读者将能够更好地理解和应用 Dori…