- vector是什么?
vector其实就是一个数组,可以看成一个动态数组。内部实现是用倍增的思想,设n为vector实际长度,m为vector最大长度,当n=m时,vector就会申请2m的空间,并且把n转移到新的空间上,再进行其他操作。
可能现在你就会有疑问了,这样的话好像如果进行删除操作,那么空间不会缩小啊,那不也没啥好处吗,不如开个数组;
但vector在删除操作结束时,如果n<=(m>>1),会释放一半的空间;
- vector的调用
vector支持随机访问,可以像数组那么调用,不过第一个元素的下标为0;
例:如果定义一个vector a,调用时直接a[i]即可;
- vector的插入和删除不支持在任意位置o(1)插入,所以为了保证vector的效率,一般增删在末尾进行;
- vector的定义
#include<vector>
vector<int(整形,浮点型……)> a;//一个长度动态变化的数组,只有一维;
vector<int(整形,浮点型……)> a[m]; //一个第一维长度为m,第二维长度动态变化的数组;
struct node{
……
};
vector<node> a; //自定义的结构体类型也可保存在vector中;
- vector的各种操作(暨函数)
1.size/empty
size()返回vector的实际长度,如果vector为空empty()返回1,反之则为0;(时间复杂度均为O(1));
顺便提一句,所有的stl容器都支持这两个函数。
2.Clear
清空
*插入知识点——迭代器
迭代器是stl容器的“指针”,可以用 * 号解除引用。
一个保存int 的vector的迭代器声明方法为:
vector<int>::iterator it;
vector的迭代器是“随机访问迭代器”,vector的迭代器可以和整数或者两个迭代器之间相加减,结果和指针相减类似,得到两个迭代器的距离。
3.begin/end
begin()返回指向vector中第一个元素的迭代器。
a[0]和*a.begin()的作用相同;
所有的容器均可看成前开后闭的结构
end()返回指向vector尾部的迭代器
当n=a.size()时,a[n]和*a.end()作用相同,都是越界访问。
所以有两种遍历vector的方法;
for(register int i=0;i<=n-1;i++)
cout<<a[i]<<endl;
for(vector<int>::iterator it=a.begin();it!=a.end();i++)
cout<<*it<<endl;
4.front/back
front( )返回vector的第一个元素,相当于a[0]和*a.begin();
back( )返回vector的最后一个元素,等价于a[n-1]和*--a.end( );
5.push_back( )和pop_back( )
push_back(x)把元素x插入到a的尾部;
pop_back( )删除a的最后一个元素;
6.reverse()
reverse(a.begin(),a.end())翻转vector a中的元素。
但这个函数不是vector独有的,其他也可用;
另一个例子:
string str="C++REVERSE"; reverse(str.begin(),str.end());//str结果为ESREVER++C