一些容器的基本特征
容器分为序列式容器与关联式容器
序列还要求其元素按严格的线性顺序排列,即存在第一个元素、最后一个元素,除第一个元素和最后 一个元素外,每个元素前后都分别有 个元素 数组和链表都是序列,但分支结构(其中每个节点都指向 两个子节点)不是。
序列式容器
vector
初始化
定义一个int类型的vector一维数组:vector<int> a
定义一个int类型的长度为10的vector一维数组:vector<int> a(10)
vector<int> a(10,1)
vector<vector<int> > a
insert()插入数据。使用:v.insert(v.begin()+2,target)。将target插入到首地址+2处
push_back(),在当前维度队尾压入数据,如果是vector<vector<int> > a 这种形式,可以这样push_back({数据}),声明一个数组本身就是用{}或直接传入所需要压入的变量,代表了第二维度的变量。所以直接用{}包裹住数据直接push_back
注意:声明一个vector,必须先存入数据之后才可以使用[i]的形式对数据处理,否则会报告运行错误。
特点
在尾部添加和删除元素的时间是固定的,但在头部或中间插入和删除元素的复杂度为线性时间
stack
初始化
stack<T> A
stack(A)拷贝构造
其他操作
push()
pop()
Top()返回栈顶元素的引用
bool empty()是否空
size()返回元素个数
后进先出,不可以遍历
queue
queue<int> temp
队列:先入先出,广度优先搜索。
力扣:二叉树层次遍历二叉树 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台
进入队列: queue.push()
出队: queue.pop()
是否为空,空则返回true: queue.empty()
deque
deque容器为双端队列,可以对其两段的数据进行操作
pop.front()
push.front(A)
pop.back()
push.back(A)
list
双向循环链表
push_back(elem);//在容器尾部加入一个元素 pop_back();//删除容器中最后一个元素 push_front(elem);//在容器开头插入一个元素 pop_front();//从容器开头移除第一个元素 insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。 clear();//移除容器的所有数据 erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。 erase(pos);//删除pos位置的数据,返回下一个数据的位置。 remove(elem);//删除容器中所有与elem值匹配的元素。
由于list元素节点并不要求在一段连续的内存中,显然在list中是不支持快速随机存取的,因此对于迭代器,只能通过“++”或“--”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作,这点,是与vector等不同的地方。
vector : vector和built-in数组类似,拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的。vector的用法解析可以参考本人的另一篇随笔:STL中的vector容器的一点总结 - VincentPass - 博客园
list: list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
deque: deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。
因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,具体可以遵循下面的原则:
1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。