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.底层数据结构:数组 双向循环链表。