【C++】deque和list以及它们和vector的区别

deque:双端队列容器

 

底层数据结构:动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来第二维的数组,从
新的第一维数组的下标oldsize/2开始存放,上下都预留相同的空行,方便支持deque的首尾元素添加

deque<int> deq;
增加:
deq.push_back(20); 从末尾添加元素 O(1)  
deq.push_front(20); 从首部添加元素 O(1)   // vec.insert(vec.begin(), 20) O(n)
deq.insert(it, 20); it指向的位置添加元素 O(n)

删除:
deq.pop_back(); 从末尾删除元素 O(1)  
deq.pop_front(); 从首部删除元素 O(1)  
deq.erase(it);  从it指向的位置删除元素 O(n)

查询搜索:
iterator(连续的insert和erase一定要考虑迭代器失效的问题)

 

list:链表容器

底层数据结构:双向的循环链表   pre data next
list<int> mylist;
增加:
mylist.push_back(20); 从末尾添加元素 O(1)
mylist.push_front(20); 从首部添加元素 O(1)   // vec.insert(vec.begin(), 20) O(n)
mylist.insert(it, 20); it指向的位置添加元素 O(1) // 链表中进行insert的时候,先要进行一个query查询操作
    对于链表来说,查询操作效率就比较慢了

删除:
mylist.pop_back(); 从末尾删除元素 O(1)
mylist.pop_front(); 从首部删除元素 O(1)
mylist.erase(it);  从it指向的位置删除元素 O(1)

查询搜索:
iterator(连续的insert和erase一定要考虑迭代器失效的问题)

deque和list,比vector容器多出来的增加删除函数接口:
push_front和pop_front


vector 特点:动态数组内存是连续的,2倍方式进行扩容。扩容的效率不是很高。reserve(20)预留空间

deque特点:动态开辟二维数组,第二维是固定长度的数组空间,扩容的时候(第一维度的宿主进行2倍扩容。)

                       deque底层开辟的空间是否是完全连续的。并不是,每一个二维是连续的。

vector和deque区别?

1,底层数据结构

2,前中后插入删除元素的时间复杂度。前面插入(vector O(n)  deque(O(1)));;;

3,内存使用的效率来说,vector使用的内存空间必须是连续的,效率低。deque可以分块进行存储,不需要内存空间必须是连续的。

4,在中间进行Insert和erase,vector和deque它们的效率是否一样,,,,vector更好一点。

vector和list之间的区别?数组:增加删除O(n)  查询O(n) 随机访问O(1)       链表,删除一个节点,增加一个节点O(1)---不考虑查找。

1.底层数据结构:数组   双向循环链表。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值