相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓
目录
✨说在前面
亲爱的读者们大家好!💖💖💖,我们又见面了,上一篇文章我给大家介绍了一下vector的定义、常用接口以及模拟实现。如果大家没有掌握好相关的知识,上一篇篇文章讲解地很详细,可以再回去看看,复习一下,再进入今天的内容。
我们今天简单给大家讲解一下STL中的一员——list。ilst对应C语言中的链表,也是STL标准库中的一大容器。如果大家准备好了,那就接着往下看吧~
👇👇👇
💘💘💘知识连线时刻(直接点击即可)🎉🎉🎉复习回顾🎉🎉🎉
博主主页传送门:愿天垂怜的博客
🍋知识点一:什么是list?
•🌰1.list的定义
在C++中,list是一个双向链表容器,它允许在序列的任何位置进行快速的插入和删除操作。与vector(基于数组的连续存储容器)不同,list的元素在内存中不是连续存储的,而是通过指针(或引用)相互连接。这种结构使得list在进行元素插入和删除时不需要移动其他元素,从而提高了这些操作的效率。
我们来看看文档中list的定义:list的文档介绍
那么list的底层是如何实现的呢?
list的底层实现是一个双向带头循环链表。每个节点(node)包含三个部分:
- 数据部分:存储元素的值。
- 指向前一个节点的指针:允许从后向前遍历链表。
- 指向下一个节点的指针:允许从前向后遍历链表。
这种结构使得list支持高效的插入和删除操作,因为你可以直接修改指针来添加或删除节点,而不需要移动其他元素。然而,由于元素在内存中的非连续存储,list的随机访问(如通过索引直接访问元素)效率较低,因为需要从头或尾开始遍历链表直到找到目标元素。
•🌰2.list的基本特性
🔥动态大小
list的大小可以动态地增长和缩小。你可以随时向其中添加或删除元素,而不需要担心容器的容量限制。
🔥非连续存储
与vector不同,list的元素在内存中不是连续存储的。每个元素都是一个节点,节点之间通过指针(或引用)相互连接。这种非连续存储的特性使得list在进行插入和删除操作时不需要移动其他元素。
🔥双向遍历
list提供了双向遍历的能力。每个节点都包含指向前一个节点和下一个节点的指针(或引用),这使得你可以轻松地从头遍历到尾,或者从尾遍历到头。
🔥高效的插入和删除
由于list的非连续存储和双向遍历特性,它在序列的任何位置插入或删除元素都是高效的。这些操作通常只需要修改几个指针,而不需要移动其他元素。
🔥不支持随机访问
尽管list提供了灵活的插入和删除操作,但它不支持通过索引直接访问元素。这是因为元素在内存中的位置不连续,无法直接通过索引计算出元素的地址。相反,你需要从头或尾开始遍历链表,直到找到目标元素。
🔥迭代器失效
在list中进行插入或删除操作时,只有指向被插入或删除元素本身的迭代器会失效。其他迭代器(包括指向其他元素的迭代器)仍然保持有效。这与vector不同,后者在插入或删除元素时可能会使所有指向该元素之后元素的迭代器失效。
🔥内存分配
由于list的每个节点都是单独分配的,因此它可能会比vector消耗更多的内存(因为每个节点都需要额外的空间来存储指针)。然而,这种内存分配方式也使得list在处理大量小对象时更加灵活和高效。
🔥排序和搜索
尽管list不支持随机访问,但它仍然提供了排序(如std::sort)和搜索(如std::find)算法。这些算法通过遍历链表来工作,因此它们的效率可能低于在随机访问容器(如vector)上执行的相同算法。
•🌰3.常用接口介绍
🔥list对象的常见构造
构造函数( (constructor)) | 接口说明 |
list (size_type n, const value_type& val =
value_type())
|
构造的
list
中包含
n
个值为
val
的
元素
|
list() | 构造空的list |
list (const list& x) | 拷贝构造函数 |
list (InputIterator first, InputIterator last) | 用[first, last)区间中的元素构造list |
🔥list iterator的使用
函数声明 | 接口说明 |
begin
+
end
|
返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器 |
rbegin
+
rend
|
返回第一个元素的
reverse_iterator,
即
end
位置
,
返回最后一个元素下一个位
置的
reverse_iterator,
即
begin
位置
|
注意:
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)于rend(begin)为反向迭代器,对迭代器执行++操作,迭代器