vector
是在一道题里发现vector的神奇 随便写点对他的理解及用法 以便以后用到可以查阅及补充
vector是一个动态数组,在c++中是个很有用的容器,用的时候记得要加上头文件#include<vector>
那么假设我定义的是vector<int>a[100],就相当于创建了100个int类型的动态数组(100个这样的容器),每一个a[ ]都是一个vector,它就像一个二维数组,只是第一维的大小是固定的(不超过100),但第二维的大小不固定。
vector<int>Q 定义一个整型的vector 名为Q
Q.size() 读取它的大小
Q.capacity() 读取它的容量
Q.resize() 改变大小
Q.push_back() 向尾部添加元素
Q.pop_back() 删除最后一个元素
Q.clear() 清空所有元素
Q.insert( Q.begin()+i , a ) 把a元素插入到数组下标为i的位置
Q.erase(Q.begin()+a) 删除下标为a的元素
Q.erase(Q.begin()+i,Q.begin()+j) 删除下标区间为[ i , j-1 ]的元素 注意这里下标 j 的元素不会删除
输出就直接常规输出就可以(cout<<a[0])
还有一些函数也可以应用到这里来:
reverse(Q.begin(),Q.end()) 翻转元素 逆序排列 要加上头文件#include<algorithm>
sort(Q.begin(),Q.end()) 要加上头文件#include<algorithm> 默认升序排列
如果要作为函数的参数,要注意写法:int func(vector<int>&a,vector<int>&b) 记得要加上&
可以通过uva101巩固对vector的练习 题目链接
但是vector也有他的不足之处。它是个单口容器,所以在头部进行操作的效率太低了。并且vector之所以能够随时增加删除,是因为本身一开始就已经申请了了一大块空间,当旧空间不足时,又会给他重新分配一块更大的空间,然后把原空间的元素赋值到新空间,再释放旧空间,听起来就效率很低吧,所以就有了deque来弥补这两个缺点。
deque
如果说vector是一个单口容器,那么deque就是一个双口容器,即double ended queue。deque在头尾都可以对元素进行插入和删除操作。并且deque没有容量的概念,它是以分段连续空间组合而成,可以随时增加一段新的空间。
deque<int>T 定义一个整型的deque 名为T
T.size() 读取容器的大小
T.max_size() 求最大容量(不清楚为什么明明说没有容量的概念 但还是会有这样一个东西)
T.resize(a) 更改容器大小为a
T.empty() 判断容器是否为空
T.push_back(a) 尾部添加元素a
T.push_front(a) 在头部添加元素a
( T.emplace_front(a) 这个也可以在头部添加元素a 暂时没发现它俩有啥区别 )
T.pop_back() 删除尾部元素
T.pop_front() 删除头部元素
T.front() 访问第一个元素
T.back() 访问最后一个元素
T[0] 下标访问第一个元素(不会检查是否越界)
T.at(0) 访问第一个元素(会检查是否越界)
T.erase(T.begin()+a,T.begin()+b) 删除下标[ a , b )区间内的元素 注意下标b的元素不删除
T.insert( T.begin()+a , n , x ) 在下标为a的位置插入n个相同的元素x 如果没有第二个参数 默认n=1
T.clear() 清空容器
deque也有它的不足:例如由于deque的迭代器比vector复杂太多,所以我们还是尽可能使用vector,如果要对deque进行排序,可复制到vector里进行排序再复制回去。