vector(向量)是一个封装了动态数组大小的顺序容器。顺序容器中的元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问对应的元素,支持数组表示法和随机访问。使用vector事需要引入头文件#include<vector>。
- 创建
vector<int>a; //创建一个空的vector,数据类型为int,数组名为a
vector<int>a(100); //创建一个vector,数组名为a,元素个数为100,所有数初值为0
vector<int>a(10,666); //创建一个vector,数组名为a,元素个数为10,所有数初值为666
vector<int>b(a); //b是a的复制
vector<int>b(a.begin()+3,a.end()-3); //复制[a.begin()+3,a.end()-3)区间的元素到vector中
vector<int>a[5]; //相当于创建了5个vrctor,每个都是一个数组
赋值
vector<int>a(10);
for(int i=0;i<10;i++)
a[i]=i;
//vector<int>b;
//b=a;
//b.assign(a.begin(),a.end());
//b.assign(10,100);
vector<int>b(a);
vector<int>c(a.begin()+3,a.end()-3);
cout<<*(a.end()-1)<<endl;
for(int i=0;i<b.size();i++)
cout<<b[i]<<" ";
cout<<endl;
for(int i=0;i<c.size();i++)
cout<<c[i]<<" ";
cout<<endl;
输出如下:
9
0 1 2 3 4 5 6 7 8 9
3 4 5 6
2.增加。向vector中添加元素,可以从尾部添加,也可以从中间添加。需要注意:从中间插入时需要将插入位置之后的所有元素后移,时间复杂度为O(n),效率较低。
它的动态扩展机制不是往后面接新空间,而是开辟一个更大的空间,把它放进去。
a.push_back(5); //在向量尾部增加一个元素5
a.insert(a.begin()+1,10); //在a.begin()+1指向元素前插入一个10
a.insert(a.begin()+1,5,10); //在a.begin()+1指向元素前插入5个10
a.insert(a.begin()+1,b.begin(),b.begin()+3); //在a.begin()+1指向元素前插入b向量的区间元素
3.删除。可以删除尾部元素、指定位置的元素、区间,还可以清空整个向量。
a.pop_back(); //删除向量中的最后一个元素
a.erase(a.begin()+1); //删除指定位置的元素
a.erase(a.begin()+3,a.end()-3); //删除区间[first,last)中的元素
a.clear(); //清空向量
4.遍历。 可以用数组表示法,也可以用迭代器对向量元素进行访问。
for(int i=0;i<a.size();i++)
cout<<a[i]<<" ";
cout<<endl;
for(vector<int>::iterator it=a.begin();it<a.end();it++)
cout<<*it<<" ";
5.改变向量的大小。resize可以改变当前向量的大小,如果它比当前向量大,则填充默认值;如果比当前向量小,则舍弃后面的部分。
但是不改变capacity();
a.resize(5); //设置向量的大小为5,默认填充值为0
a.resize(5,15);//设置向量的大小为5,默认填充值为15
6.查找函数
find(a.begin(),a.end(),x) 从first到last找x,如果找到返回位置,没找到则返回值为a.end()
vector<int>::iterator it=find(a.begin(),a.end(),4);
if(it!=a.end())
cout<<it-a.begin()<<endl;
else
cout<<-1<<endl;
7.交换函数swap
巧用可以释放多余空间
vector<int>a;
for(int i=1;i<=10000;i++)
{
a.push_back(i);
}
cout<<a.capacity()<<endl;
cout<<a.size()<<endl;
a.resize(3);
cout<<a.capacity()<<endl;
cout<<a.size()<<endl;
vector<int>(a).swap(a);//先以a的大小构造一个匿名对象,它的容量和大小都是3
//在将匿名对象和a交换,同时在当前行执行结束以后匿名对象被销毁
cout<<a.capacity()<<endl;
cout<<a.size()<<endl;
8.预留空间(减少动态扩展容量次数)
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问
vector<int>a;
cout<<a.capacity()<<endl;
cout<<a.size()<<endl;
for(int i=1;i<=10000;i++)
{
a.push_back(i);
}
a.reserve(30000);
cout<<a.capacity()<<endl;
cout<<a.size()<<endl;
a.reserve(3);
cout<<a.capacity()<<endl;
cout<<a.size()<<endl;
但是注意只扩大不缩小
9.数据存取
- at(int idx) //返回下标idx所指的数据
- 用[]直接输出
10.排序
sort(d.begin(),a.end());