1.vector类(注意,它是一个类了)为内置数组提供了一种替代表示,与string类一样,vector类是标准C++引入的标准库的一部分。
2.为了使用vector,我们需要引入相关头文件:#include<vector>
3.使用vector有两种不同的形式,即所谓的数组习惯和STL习惯。在数组习惯用法中,我们模仿内置数组的用法’定义一个已知长度的vector:
如:vector<int> ivec(10);//它就类似于int ia[10];
4.vector的元素被初始化为与其类型相关的缺省值,算术和指针类型缺省值为0.而对于class类型,缺省值可通过调用这个类的缺省构造函数获得。(注意,像内置数据类型,如int 等,是全局变量的话则会初始化为0.局部变量则不会。而C++ 标准库类型或者用户自定义的类,则会根据构造函数来初始化)
5.当然我们也可以显式的初始化一个向量:vector<int>ivec(10,-1);
6.对于内置数组,我们可以显式得把数组的元素初始化为一组常量值。如: int ia[6]={-2,-1,0,1,2,1024};
我们不能用相同的方法显式地初始化vector,但是可将vector初始化为一个已有数组的全部或一部分。通过制定已有数组的开始地址和最末地址的下一位(注意,是下一位)即可。
如vector<int>ivec(ia,ia+6)。就可以把数组ia拷贝到ivec中。
当然,也可以截取其中的一部分,如:vector<int> ivec(&ia[2],&ia[5]);
7.vector可以被另一个vector初始化,或被赋给另一个vector。如:
vector<string> svec;vector<string>user_names(svec);//用svec初始化user_name。
vector<string> svec2;svec2=svec;//直接赋值。
8.STL中对vector的习惯用法完全不同,我们不是定义一个已知大小的vector,而是定义一个空vector:
vector<string>text;
然后我们向vector中插入元素,而不再是索引元素,我们使用push_back()这个方法来向vector的后面插入元素。比如:
string word;
while(cin>>word)
{
text.push_back(word);
}
访问元素我们的典型用法是使用vector操作集中的begin()和end()所返回的迭代器(iterator)
for(vector<string>::iterator it=text.begin();it!=text.end();++it)
cout<<*it<<' ';
其实iterator是标准库中的类,它具有指针的功能。
10.注意,当我们这样写:vector<int>ivec;的时候,我们定义的是一个空的vector,如果写这样的语句ivec【0】=1024。这个语句的本意是赋值,但是是错的,因为我们所定义的ivec是个空向量,而ivec[0]是一个取索引的操作,对于空向量,我们还没有第一个元素,所以不能取索引。(我们只能索引已经存在的元素)
11.posh_back操作是在已有的向量的后面插入,而不是覆盖掉某个现有的元素。比如以下程序:
const int size=7;
int ia[size]={0,1,1,2,3,5,8};
vector<int>ivec(size);//这时候ivec其实已经初始化为全0 的七个元素
for(int ix=0;ix<size;++ix)
ivec.push_back(ia[ix]);
这个程序的本意是想用ia的七个元素填充ivec,但是结果会造成ivec有14个元素,ia的元素从第八个元素才开始插入。