C++中Vector、Deque、List不同

134 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
Snipaste_2022-12-15_21-27-52.jpg 首先来看看这三种数据类型如何定义
定义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由于是连续的空间,移动更高效