一篇文章搞懂STL中的顺序容器之list

本文详细解析STL中的list容器,包括其结点结构、迭代器实现、数据结构特点、内存管理和常用操作。list是一个双向循环链表,支持高效插入删除,内存管理涉及节点的分配与释放。此外,文章探讨了list与vector、deque的区别。
摘要由CSDN通过智能技术生成

0.概述

1.结点

2.迭代器

3.数据结构

​​4.内存管理

4.1内存分配与释放

空间配置器list_node_allocator

开辟一个节点空间get_node()

释放一个结点空间put_node()

开辟一个结点空间并构造create_node()

释放一个结点空间并析构destory_node()       

4.2内存使用

构造函数list()

push_back()

push_front()

erase()

pop_front()

pop_back()

clear

remove

unique

splice

merge

reverse

sort

5.使用

6.参考资料 


0.概述
 

 list是什么?    list本质上就是双向链表
相对与上一篇所讲的vector,我们知道双向链表有它自己的优点,首先空间利用比较灵活,所以省空间.
而且插入删除元素都是常数时间
下面将参照list的源码,将其分为下面几部分去讲

1.结点

既然list是链表,那就必须得定义它自己的结点类
在源码中它的结点是这样子的 

 

2.迭代器

 

不像vector是连续的内存空间,所以可以直接用指针作为迭代器
在 list中由于是链式存储的,所以得定义一个属于自己的迭代器 
直接看一些它的源码



可以看到在迭代器类中 有一个成员变量 node,用来存放该迭代器指向的结点,
可以通过构造函数给node指定指向的结点,
也可以给通过复制构造函数给node指定好另一个迭代器的node指向的结点.
由于list只支持双向迭代器(因为双向链表要支持前移 后移),所以对运算符++ ,-- ,* ,->进行了重载.
注意 在list中插入结点和删除某个结点并不会使其他结点的迭代器失效,
而vector就并非如此,因为插入元素可能导致原有内存重新分配 导致原有迭代器失效
 


3.数据结构

list是一个双向循环链表,既然是循环,也就是说尾结点的下一个就是头结点,头结点的上一个就是尾结点.
同时只要用一个结点指针指向了其中一个结点,就可以遍历到其他任意结点
在list中定义了一个空白的尾结点指针 用node表示  如下图表示

通过这个node,就可以表示出其他任意一个节点了,这样就可以实现我们的一些list的基本操作, 

比如返回头结点(即返回node->next就可以了),返回尾结点(返回node本身就行了),返回头结点值,返回尾结点值,以及判空,返回长度

我们看一下在源码中是怎么实现的 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值