STL内容学习简介
C++STL : standard template libaray
vector容器
底层数据结构:动态开辟的数组。每次以空间大的二倍扩容
增加
vec.push_back(20); 末尾添加元素20 — O(1)
vec.insert(it,20);在it迭代器指向的位置插入元素20 — O(n)
删除
vec.pop_back; 末尾删除元素 ---- O(1)
vec.erase(it) ;删除it迭代器指向的位置的元素 — O(n)
查询
operator[ ]使用vec[ i ]访问第i个位置元素 — O(1)
iterator迭代器进行遍历
find,for_each
常用方法
size()
empty()
reserve(20):给vector预留空间的
resize(20):给容器扩容用的
swap(a,b):两个容器进行元素交换

deque和list
deque:双端队列容器
底层数据结构:动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容以后,原来第二维的数组,从新的第一维数组下标oldsize/2开始存放,上下都预留相同空行。方便支持deque的首尾元素添加
deque < int > deq;
增加:
deq.push_back(20);从末尾添加元素 — O(1)
deq.push_front(20);从首部添加元素 — O(1)
deq.insert(it,20);在it迭代器指向的位置插入元素20 — O(n)
删除:
deq.pop_back();从尾部删除元素 — O(1)
deq.push_front(20);从首部删除元素 — O(1)
deq.erase(it) ;删除it迭代器指向的位置的元素 — O(n)
list:链表容器
底层数据结构:双向的循环链表 — pre,data,next
list< int> mylist;
增加:
mylist.push_back(20);从末尾添加元素 — O(1)
mylist.push_front(20);从首部添加元素 — O(1)
mylist.insert(it,20);在it迭代器指向的位置插入元素20 — O(n)
删除:
mylist.pop_back();从尾部删除元素 — O(1)
mylist.push_front(20);从首部删除元素 — O(1)
mylist.erase(it) ;删除it迭代器指向的位置的元素 — O(1)
对于链表来说,查询的操作比较慢O(n)
vector,deque和list对比
vector特点:动态数组,内存是连续的,2倍方式进行扩容
deque特点:动态开辟的二维数组空间,第二维是固定长度的连续空间。扩容的时候,第一维数据进行二倍扩容
面经问题:deque底层内存是否是连续的?
并不是。第二维度是连续的,但每个第二维之间并不是连续的。
vector和deque之间的区别:
1.底层数据结构
2.前中后插入删除元素的时间复杂度:中间和末尾O(1),在首部插入,deque是O(1),vector是O(n).
3.对于内存的使用效率来说:vector 需要的内存空间必须是连续的
而deque不需要
4.在中间进行insert()或者erase()的效率:都是O(n)。都要进行元素移动,但是vector是完全连续的,所以比较简单一点,
vector和list之间的区别:
1.底层数据结构:数组 双向循环链表
数组:增加删除O(n),查询O(n),随机访问O(1)
链表:增加删除O(1),查询O(n),随机访问O(n)
详解容器适配器
1.适配器底层没有自己的数据结构,他是另外一个容器的封装,它的方法,全部由底层依赖的容器进行实现。
2.没有实现自己的迭代器
template<typename T,typename Container=deque<T>>
class Stack {
public:
void push(const T& val)
{
con.push_back(val);
}
void pop() {
con.pop_back();
}
T top()const

最低0.47元/天 解锁文章
1962

被折叠的 条评论
为什么被折叠?



