vector向量容器与数组相似之处:
vector能像数组一样通过下标对元素进行随机访问或者对某个元素重新赋值,下标都是从0开始。
vector向量容器的优点:
vector具有内存自带管理的功能,对于元素的插入和删除,可动态分配调整所占的内存空间。对于对空间要求很严格的题,用数组超时的话,尤其是二维数组,用vector向量容器可以节省很多空间。
vector向量容器的简单用法:
begin()返回的是首元素的位置的迭代器;end()返回的是最后一个元素的下一个元素的位置的迭代器。
定义:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int i;
//不指定容器的元素个数,如定义一个用来存储整形的容器
vector<int> a;
//创建时,指定容器的大小
//注意:元素的下标是0-9,另外每个元素的值被初始化为0
vector<int> b1(10);//相当于b1[10],memset(b1,0,sizeof(b1))元素初始化为0
vector<double> b2(10);
vector<char> b3(10);//char类型也被初始化为0,对应其ASCII代码就是初始化为“NUL”
//创建时,指定容器大小被初始化值
vector<int> c1(10,6);
vector<double> c2(10,6.6);
vector<char> c3(10,65);
for(i=0;i<10;i++)
printf("b1=%d b2=%.1f b3=%c c1=%d c2=%.1f c3=%c\n",b1[i],b2[i],b3[i],c1[i],c2[i],c3[i]);
return 0;
}
输出为:
push_back()尾部元素扩张,insert()元素的插入,erase()元素的删除:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int i;
//不指定容器的元素个数,如定义一个用来存储整形的容器
vector<int> a;
a.push_back(2);// 尾部元素扩张
a.push_back(6);
cout<<"a[0]="<<a[0]<<",a[1]="<<a[1]<<endl;//用下标方式访问vector元素
//元素的插入,用insert()
//insert可以在vector对象的任意位置前插入一个新元素,同时vector自动扩张下一个元素空间,插入位置的所有元素以此向后挪动一个位置
a.insert(a.begin(),0);//在最前面插入新元素,元素值为8
a.insert(a.begin()+2,5);//在下标为2的元素位置放入新元素5
a.insert(a.end(),12);//在最后插入新元素12
for(i=0;i<5;i++)
cout<<a[i]<<" ";
cout<<endl;
/*
元素的删除,用erase()
erase()可以删除vector中迭代器所指的一个元素或一段区间的所有元素
*/
a.erase(a.begin()+2);//删除第二个元素
cout<<"删除后输出:";
for(i=0;i<4;i++)
cout<<a[i]<<" ";
return 0;
}
输出:
用迭代器访问vector元素:
迭代器是STL中很重要的一个工具。配合循环语句来对vector对象进行遍历访问,迭代器的类型一定要与它要遍历的vector对象的元素类型一致。
vector<int>::iterator it;
for(it=a.begin();it!=a.end();it++)
cout<<*it<<" ";
清空vector容器clear(),配合迭代器的删除erase(),返回向量大小size(),逆序reverse(),排序sort(),查看是否为空empty():
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int i;
vector<int> a;
a.push_back(2);
a.push_back(6);
a.push_back(10);
a.push_back(5);
a.push_back(3);
//迭代器
vector<int>::iterator it;
//删除迭代器第1到第3区间的所有元素
a.erase(a.begin()+1,a.begin()+3); //即删除a[1],a[2]
for(it=a.begin();it!=a.end();it++)
cout<<*it<<" ";
cout<<endl;
//逆序,需要头文件 #include<algorithm>
reverse(a.begin(),a.end());
cout<<"逆序:";
for(it=a.begin();it!=a.end();it++)
cout<<*it<<" ";
cout<<endl;
//排序,需要头文件 #include<algorithm>
sort(a.begin(),a.end());
cout<<"升序:";
for(it=a.begin();it!=a.end();it++)
cout<<*it<<" ";
cout<<endl;
//清空向量
a.clear();
//输出向量大小
cout<<"向量大小:"<<a.size()<<endl;
if(a.empty())
cout<<"向量为空."<<endl;
return 0;
}
输出:
sort的详细用法可以看博主之前写的
总结一下常用的函数:push_back(),begin(),end(),size(),empty(),erase(),insert()
上面介绍vector的用法都是一维的,当然vector用法还有二维的。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int i;
int a=1,b=3,c=4;
vector <int> v[3];
v[a].push_back(b);
v[a].push_back(c);
for(i=0;i<v[a].size();i++)
printf("%d\n",v[a][i]);
return 0;
}
相当于定义了一个a[3][]的数组,a[1][0]=3,a[1][1]=4。