说明:vector是C++中一个非常方便的容器类,它用于存放类型相同的元素,利用成员函数及相关函数可以方便的对元素进行增加或删除,排序或逆序等等,下面将对这些功能一一叙述。
一.vector的第一种用法
1.包含的头文件:#include<vector>
2.格式:vector<Type> vi;
创建一个元素类型为Type的vector对象,Type可以是int,double,string,甚至还可以是结构体类型,
3.vi.pushback(Type a);
在容器的尾部插入一个元素,需要注意的是,插入元素的类型应该与创建 对象时的类型一致。
4.通过下标法像数组一样来访问元素,cout<<vi[i];表示打印vi的第i+1元素到显示屏上,同数组一样,下标访问是从0开始的,这也是此处为什么是第i+1个元素的原因。
5.利用迭代器来访问元素,首先得创建一个迭代器格式如下:
vector <Type>::iterator it;
然后访问方式如下:
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
//vi.begin()表示从vi的第一个元素开始,vi.end()表示vi的最后一个元素
6.vi.insert(vi.begin()+count,'a');
在第count个元素后插入‘a’这个元素,(注意插入元素类型也应该与创建是的元素类型一致)
7.vi.erase(vi.begin()+3,vi.begin()+6);
删除区间第[3+1,6]个元素,若第二个参数不写,如:vi.erase(vi.begin()+3),则表示删除第(3+1)个元素。
8.以下为两个对容器元素进行翻转和排序的函数,使用时需包含的头文件:#include<algorithm>
(笔者所用的编译环境为QtCreator5.5,在使用时,试了一下,没包含也没报错)
a.reverse(vi.begin(),vi.end());
将容器中的所有元素进行翻转,即从尾排到头。
b.sort(vi.begin(),vi.end(),Comp);
按照Comp函数所自定义的排序方式对容器类的元素进行排序,假如定义的Comp函数如下:
bool Comp(const int &a,const int&b) //自定义元素排列顺序
{
return a>b;
}
则sort函数将按照定义的比较函数进行排序,此处为降序排列,即从大到小。值得注意的是,sort函数的第三个参数是可有可无的,当不写时,默认按照升序即从小到大排列,并且当第三个参数存在时,其格式只 能为函数名,不能加函数括号,否则会报错。
9.vi.clear();
清空元素。
下面将用一段代码综述以上所讲,仔细看完这段代码,一切将会豁然开朗:
示例1:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool Comp(const int &a,const int&b) //自定义元素排列顺序
{
return a>b;
}
int main()
{
vector<int> vi;
//创建vector对象
cout<<"sizeof(vi) = "<<sizeof(vi)<<endl;
//模板类对象vi的大小永远是12(本机)
cout<<endl<<"+++++++++++++++++++++++++++++++++++++"<<endl;
//分隔符,为了更好地看结果
for(int i = 0;i<10;i++)
vi.push_back(i);
//在容器尾部插入数字
for(int i = 0;i<10;i++)
cout<<vi[i]<<" ";
//使用下标访问元素,下标是从0开始的
cout<<endl<<"++++++++++++++++++++++++++++++++++++++"<<endl;
//同上
vector<int>::iterator it;
//创建一个迭代器用来访问容器vi
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"++++++++++++++++++++++++++++++++++++++"<<endl;
//同上
vi.insert(vi.begin()+3,'a');
//在第(3+1)个元素前插入'a';
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++"<<endl;
vi.erase(vi.begin()+3);
//删除第(3+1)个元素
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
vi.erase(vi.begin()+3,vi.begin()+6);
//删除区间第[3+1,6]个元素
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
cout<<"vi.size() = "<<vi.size()<<" ";
//求向量的大小(包含的元素个数)
cout<<"sizeof(vi) = "<<sizeof(vi)<<endl;
//求类对象vi的大小
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
reverse(vi.begin(),vi.end());
//将元素翻转
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
sort(vi.begin(),vi.end());
//将元素排序,默认从小到大
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
sort(vi.begin(),vi.end(),Comp);
//按自定义顺序进行排列元素
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
return 0;
}
程序运行结果:
二.vector的第二种用法(头文件同上)
1.格式:vector<int> vi(10);(相当于int vi[10];)
其实此种方式与上种在使用方式上几乎一样,唯一的差别在于这种方式在创建一个vector对 象时就已经确定了其大小,并且对于int,double以及指针等类型,默认初始化为0,当然也可以人 为初始化,如:
vector<int> vi<10,1>;创建了一个vi对象,含有十个int类型的元素,并且每个元素都被初始化为1, 需要注意的是,对于数组,可以这样来初始化:
int vi[3] = {1,2,3};
但对于vector对象,则不行。但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定用来初始化 vector 的数组的开始地址以及(结束地址+1)即可,例如:
示例2:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int arr[5] = {0,1,2,3,4};
vector<int> vi(arr+1,arr+4);
//用数组的第2~4个元素初始化vi
vector<int>::iterator it;
//使用迭代器访问元素
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
return 0;
}
程序运行结果:
2.vector对象可用另一个vector对象来初始化,
vector<int> vi(10,1);
vector<int> vj(vi);
3.需要注意的是,用这种方式在创建对象时虽然确定了其大小,但后续的插入,删除等操作会改变‘对象的大小,例如:
示例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vi(10,1);
vector<int>::iterator it;
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"vi.size = "<<vi.size()<<endl;
//打印初始大小
cout<<"+++++++++++++++++++++++++++++"<<endl;
int i = 0;
for(;i<5;i++)
vi.push_back(i);
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"vi.size = "<<vi.size()<<endl;
//打印插入5个元素后的大小
cout<<"+++++++++++++++++++++++++++++"<<endl;
vi.erase(vi.begin()+1);
for(it = vi.begin();it != vi.end();it++)
cout<<*it<<" ";
cout<<endl<<"vi.size = "<<vi.size()<<endl;
//打印删除一个元素后的大小
return 0;
}
程序运行结果: