开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
首先来看看这三种数据类型如何定义
定义List
void test()
{
//空的list
list<int> l1;
//包含10个整型1的list
list<int> l2(10, 1);
//用l2构造l3
list<int> l3(l2);
}
定义Deque
// 定义一个int类型的双端队列a
deque<int> a;
// 定义一个int类型的双端队列a,并设置初始大小为10
deque<int> a(10);
// 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1
deque<int> a(10, 1);
定义Vector
//创建一个空vector
vector()
//创建一个vector,元素个数为20
vector(20)
vector与list
- list:底层是双向双向循环链表
- vector 插入、删除、查找 为
O(N),随机访问为O(1); - list:链表 插入删除时
O(1)但是需要考虑搜索的时间O(N),链表的搜索是比较慢的
vector和deque不同
- vector:底层动态数组,内存连续,二倍方式扩容
- vector vec默认是没有开辟空间的, 0->1->2->4->8->16 可以用
reserve(20)方法只开辟空间,但是并没有放置元素 - deque:动态开辟的二维数组空间,第二维是固定长度的空间,扩容的时候,是将第一维数组进行二倍扩容,再把二维的数据空间放到新的第一维的数组空间里
- deque:底层存储空间是否连续?
根据deque底部存储空间的原理说明,不是连续的, 但是每一个第二维空间是连续的. 所有的二维是分段的。
vector和deque不同 - 底层数据结构不一样
- 前中后插入删除元素时间复杂度不一样:
中间和末尾的插入和删除的时间复杂度是一样的,末尾为(O(1)),中间为O(N)
deque前面插入删除复杂度为O(1), vector前面插入删除复杂度为O(N) - 对内存的使用效率: vector 需要的内存空间必须连续
deque 的第二维是连续的,但是每个第二维不需要连续。因此可以分块存储,不需要一大片连续的存储空间。
在空间进行insert或者erase,vector和deque 他们的效率那个好一些? - 都是O(N) vector由于是连续的空间,移动更高效