【STL序列式容器】看看list的结构

本文详细探讨了STL中的list容器,强调其作为双向链表的特性,指出其内存利用率高且插入删除操作时间复杂度为O(1)。内容包括list节点、迭代器的性质,以及insert和transfer等关键操作的实现细节,揭示了list如何维护环状双向链表以及在元素迁移过程中的指针管理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


vector不同, list的底层是用 双向链表实现的,其逻辑上连续的元素并不是地址连续的。

list每插入或删除一个元素,就配置或释放一个元素的空间,内存利用率较高。对于任意位置上元素的插入或删除操作,永远是常数时间。vector的是O(n)

list的节点

template <class T>
struct ListNode {
    T data;
    ListNode<T> *prev;
    ListNode<T> *next;
};

list的迭代器

由于list是一个双向链表,迭代器必须具备前移后移的能力,所以list的迭代器属于Bidirectional Iterator
在这里插入图片描述
list添加元素的操作不会使原有的迭代器失效,而vector会重新配置空间会导致原有的迭代器失效;list的删除操作会使“指向被删除元素”的迭代器失效(引用未定义内容),而vector的指向被删除元素的迭代器会指向被删除元素的下一个元素

list的结构

SGI list不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针,便可表示完整的链表。

为了使list能满足STL前闭后开区间的要求,环状双向链表维护了一个尾空节点

list::end()指向的就是尾空节点
list为空时,尾空节点的prevnext都指向自己。list对象持有尾空节点的地址。
在这里插入图片描述

list的相关操作

insert

本质上,vectorlist的插入元素操作,都会把新元素插在迭代器position所指的元素的前面,只不过在插入操作完成后,vectorposition指向了新插入的元素,listposition指向原有的元素。

有如下list
在这里插入图片描述
position处插入新元素7会变成这样:
在这里插入图片描述
vector的话会是这样:
在这里插入图片描述
此外,list支持push_frontpush_backpop_frontpop_backeraseclearremoveunique等操作。

transfer

list内部提供了一个transfer操作:将某连续范围内的元素迁移到某个特定位置之前。这个函数实现的难点在于指针的移动,它为诸如splicemergesort等更复杂的操作奠定了基础。

list不能使用STL算法的sort(只接受Random Access Iterator),所以它自定义了一个sort成员函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值