C++ primer 读书笔记系列——(2)标准库vector类型

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不能被改变!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值