上期回顾/这期的大饼
上期我们学了迭代器的用法,和关于vector的练习题(没看过的可以点这——>上期链接)
这期我们将学习deque双向队列 和 list链表 的用法。
什么是deque
deque:也是顺序容器的一种,也是一个可变长数组。如果需要用deque,需要包含头文件 deque。所有适用于vector的操作都适用于deque,deque在头尾增删元素性能较好。
1.deque的特点
- deque 和 vector 有很多类似的地方。在 deque 中,随机存取任何元素都能在常熟时间内完成(但慢于 vector )。
- 它相当于 vector 的优点是,vector 在头部删除或添加元素的速度很慢。在尾部添加元素的性能好,而 deque 在头部增删元素都具有较好的性能(大多数情况下都能在常数时间内完成)。
2.deque有两种 vector 没有的成员函数
- void push_front(const T&val);//将val插入容器的头部
- void pop_front();//删除容器头部的元素
3.deque使用注意
- deque支持随机存储
- deque支持在头部和尾部存储数据
- deque不支持capacity和reserve操作
deque的用法与vector差不多,所以作者在这并不过多叙述。
deque的用法与vector差不多,所以作者在这并不过多叙述。
deque的用法与vector差不多,所以作者在这并不过多叙述。
deque的用法与vector差不多,所以作者在这并不过多叙述。
deque的用法与vector差不多,所以作者在这并不过多叙述。
deque的用法与vector差不多,所以作者在这并不过多叙述。
什么是list
list-链表介绍
在C++中,list是一种双向链表的容器。它可以存储各种类型的元素,并且支持在任意位置进行插入和删除操作,而不需要移动其他元素。list中的元素按照它们在容器中的顺序排列,并且可以通过迭代器来访问。
以下是一些list的特点和功能:
1. 双向链表:list是由一个个节点组成的双向链表,每个节点包含一个元素和对前后节点的引用。
2. 动态大小:list在运行时可以动态增长或缩小,不需要事先指定容器的大小。
3. 插入和删除:list支持在任意位置插入和删除元素。插入和删除操作的时间复杂度是O(1)。
4. 迭代器:list提供了迭代器来遍历容器中的元素。迭代器可以向前或向后遍历,可以通过迭代器进行插入和删除操作。
5. 没有随机访问:由于list是一个链表,所以不能像数组或向量那样通过索引来直接访问元素。要访问list中的元素,需要使用迭代器进行遍历。
以下是一些常用的list操作和方法:
1. 插入操作:使用insert()函数在指定位置插入一个元素,使用push_back()函数在末尾插入一个元素,使用push_front()函数在头部插入一个元素。
2. 删除操作:使用erase()函数删除指定位置的元素,使用pop_back()函数删除末尾元素,使用pop_front()函数删除头部元素。
3. 访问元素:使用迭代器来遍历list中的元素。begin()函数返回一个指向第一个元素的迭代器,end()函数返回一个尾后迭代器。
4. 大小操作:使用size()函数获取list中元素的个数。
5. 其他操作:list还提供了排序、合并、反转等操作,可以使用sort()、merge()和reverse()等函数来实现。
以下是一些常用的list操作和方法:
插入操作:使用insert()函数在指定位置插入一个元素,使用push_back()函数在末尾插入一个元素,使用push_front()函数在头部插入一个元素。
删除操作:使用erase()函数删除指定位置的元素,使用pop_back()函数删除末尾元素,使用pop_front()函数删除头部元素。
访问元素:使用迭代器来遍历list中的元素。begin()函数返回一个指向第一个元素的迭代器,end()函数返回一个尾后迭代器。
大小操作:使用size()函数获取list中元素的个数。
其他操作:list还提供了排序、合并、反转等操作,可以使用sort()、merge()和reverse()等函数来实现。
总之,list是一个灵活的容器,适用于需要频繁插入和删除元素的场景。它的操作复杂度比较低,但由于链表结构的特性,访问元素的效率较低。
顺序存储的优缺点分析
优点:
- 无需为表示节点间的逻辑关系而增加额外的存储空间
- 可方便地随机存储表中的任一元素。
缺点:
- 插入或删除平均需要移动一半的节点
- 顺序表要求占用连续的存储空间,比如数组:定义时需要确定数组大小,可能造成空间不足或者浪费
list:
是一个线性双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中(可以连续),并且由指针将有序的元素链接起来。
特点:
- list随机检索的性能非常的不好,因为它不像 vector 那样直接找到元素的地址,而是要从头一个一个的顺序查找
- 但是它可以迅速地在任何节点进行插入和删除操作,因为 list 的每一个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响
- list 支持双向迭代器,没有下标,必须使用迭代器遍历 list 。(由于不支持随机迭代器,不能写迭代器+x,迭代器-x,不能用sort()函数,但 list 拥有 sort 成员函数)
list相关函数
函数名 | 函数说明 |
---|---|
push_back(元素) | 往链表尾部添加元素 |
push_front(元素) | 往链表头部添加元素 |
pop_back(元素) | 链表尾部移除元素 |
pop_front(元素) | 链表头部移除元素 |
insert() | 在指定位置插入一个或多个元素 |
begin() | 获取链表的起始地址 |
end() | 获取链表的结束地址 |
size() | 返回链表元素个数 |
max_size() | 获取链表支持的最大容量 |
erase(开始地址,结束地址) | 删除链表中指定范围的元素 |
remove(值val) | 删除和 val 相等的元素 |
clear() | 清空链表 |
empty() | 判断链表是否为空 |
reverse(开始地址,结束地址) | 翻转链表所有值 |
sort(链表对象) | 链表元素排序 |
注:STL 中的算法 sort 可以用来对 vector 和 deque 排序,它需要随机访问器的支持。因为 list 不支持随机访问迭代器,所以不能用算法 sort 对 list 容器排序。因此, list 容器引入了 sort 成员函数以完成排序。
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!