vector是一个类模板,我们把vector称为容器。和标准库string类似,使用vector前,必须包含相应的头文件:
#include<vector>
using std::vector;
(一)vector对象的定义和初始化
vector 类模板定义了好几种构造函数,用来定义和初始化vector对象。
vector<T> v1 vector保存类型为T的对象,默认构造函数v1为空。
vector<T> v2(v1) v2是v1的一个副本,调用拷贝构造函数。
vector<T> v3(n,i) v3包含n个值为i的元素。
vector<T> v4(n) v4含有值初始化的元素的n个副本。
1.创建确定个数的元素
当把一个vector对象复制到另一个vector对象时,新复制的vector中每一个元素都初始化为原vector中相应元素的副本,但这两个vector对象必须保存同一种类型:
vector<int> v1;
vector<int> v2(v1); //right
vector<string> v3(v1); //error!
可以用元素个数和元素值对vector对象进行初始化。
vector<int> v1(10,42) //10个元素,每个元素初始值为42;
vector<string> v2(10,"hello"); //10个元素,每个元素初始值为hello;
2.值的初始化
如果没有指定元素的初始值,则标准库会自动提供一个元素初始值进行初始。这个由库生成的初始值将用来初始化容器中的每个元素,具体值为何,取决于存储在vector中元素的数据类型。
如果vector保存内置类型,那么标准库将用0值初始化。
vector<int> vec1(10) //10个元素,每个元素初始化为0;
如果vector保存类类型,那么标准库将用该类的得默认构造函数初始化该元素。
vector<string> vec2(10) //10个元素,每个元素初始化为空串
(二)vector 对象的操作
标准库vector提供了很多类似于string标准库德操作,如下:
v.empty() //如果v为空,则返回true;
v.size() //返回一个vector<T>::size_type类型的值,该值为v的元素个数;
v.push_back(t) //在v的末尾添加一个元素t;
v[n] //返回v的第n个元素。
v1=v2 //把V1的元素替换为V2的元素的副本
v1==v2 //如果v1与v2想等,则返回true;
1.vector对象的size;
同string的size类似,使用vector的size时,必须制定vector的元素类型:
vector<int>::size_type vec; //right;
vector::size_type //error!
2.向vector中添加元素;
push_back()操作接受一个元素值,并将它做为一个新的元素添加到vector的后面。
string str;
vector<string> vec;
while(cin>>str)
{
vec.push_back(str);
}
3.vector的下标操作;
vector<int> vec(10);
for(vector<int>::size_type ix=0;ix!=vec.size();ix++)
{
cout<<vec[ix]<<" ";
}
cout<<endl;
以上使用为正确使用方式,但要注意下面情况:
vector<int> vec(10);
for(vector<int>size_type ix=0;ix!=vec.size();ix++)
{
vec.push_back(ix);
}
此循环为一死循环! 每次使用push_back时,vec的size值就加1,而不是一开始定义的10个元素!
vector<int> vec;
for(vector::size_type ix=0;ix!=10;ix++)
{
vec[ix]=ix; //disaster:vec has no elements;
}
可将vec[ix]=ix改为vec.push_back(ix),则为正确形式!
(三)迭代器简介
除了可使用下标来访问vector外,标准库还提供了另外一种访问元素的方法:使用迭代器! 因为使用迭代器对所有容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作来访问容器元素。
1.容器的iterator类型
注意:在使用迭代器时,必须要指定迭代器的类型!
vector<int>::iterator iter //ok!
vector::iterator iter// error!
2.begin和end操作
begin操作返回容器的第一个元素的迭代器,而end操作并不是返回容器的最后一个元素的迭代器,而是最后一个元素的下一个迭代器。要注意,如果vector为空,则begin返回的迭代器与end返回的迭代器相同!
3.vector类型的自增和解引用运算
迭代器类型可使用解引用操作符(*)来访问迭代器所指向的元素。
可使用自增运算符++来使迭代器指向下一个元素。
vector<int> vec(10,42);
for(vector<int>::iterator iter=vec.begin();iter!=vec.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
4.const_iterator和const类型的iterator
const_iterator类型的迭代器不允许改变该迭代器所指向的元素值!
vector<string> str(10,"hello");
for(vector<string>::const_iterator iter=str.begin();iter!=str.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
而若将循环内的cout<<*iter<<" ";改为*iter=" ";则为错误用法,当对const_iterator进行解引用时,返回的值为一个const值,不允许用const_iterator进行赋值!
不要把const_iterator迭代器和const类型的iterator混淆起来,声明一个const类型的迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值。
vector<int> vec(10);
const vector<int>::iterator iter=vec.begin();
*iter=1; //ok!
iter++; //error!
vector<int>::const_iterator iter1=vec.begin();
*iter1=1; //error!
iter++ //ok!
即:const_iterator 元素值不能被改变;
const类型的iterator的iter不能被改变!