计算机系统应用教程网站

网站首页 > 技术文章 正文

C++11新特性(10)-容器的cbegin和cend函数

btikc 2024-10-17 08:42:50 技术文章 7 ℃ 0 评论

同样的方法,不同的迭代器

先看下面的程序:

sum=0;

vector<int>v{1,2,3,4,5,6};

vector<int>::iterator it=v.begin();

while(it!=v.end()){

 sum+=*it;

 it++;

}

代码很简单,首先取得vector的迭代器,然后遍历vector求和。

再看下面的代码:

sum=0;

const vector<int> cv{1,2,3,4,5,6};

vector<int>::iterator cit=cv.begin();

while(cit!=v.end()){

 sum+=*cit;

 cit++;

}

差不多相同的代码,但却不能通过编译。其原因是定义的vector是const类型,所以返回的迭代器也是const类型。

想让代码通过编译并不难,只要做如下修改:

sum=0;

const vector<int> cv{1,2,3,4,5,6};

vector<int>::const_iterator cit=cv.begin();

while(cit!=v.end()){

 sum+=*cit;

 cit++;

}

或者使用auto类型修饰符:

sum=0;

auto ait=cv.begin();

while(ait!=cv.end()){

 sum+=*ait;

 ait++;

}

使用auto修饰符省去了人工区分迭代器类型的麻烦,同时又不会妨碍const类型迭代器的保护功能。

更进一步

vector本身是const类型,生成的迭代器就必须是const类型。这样,在编译层次就避免了可能发生的对vector数据的修改。

还有另外一种情况,数据本身不是const类型,但是从设计的角度来讲有些时候不应该被修改。也就是说语义上应该是const类型的迭代器。C++11为此提供了cbegin和cend方法,使得在使用auto修飾符時也可以指定迭代器的類型。

vector<int> v{1,2,3,4,5,6};、

auto ait=v.cbegin();

while(ait!=v.cend()){

 sum+=*ait;

 *ait=sum;//编译错误

 ait++;

}

cbegin()/cend()决定了返回的迭代器类型为const。这时即使vector的类型不是const,也可以防止对该数据的误操作。

当然了,也可以使用下面的代码达成相同的目的。

vector<int>::const_iterator it=v.begin();

while(it!=v.end()){

 sum+=*it;

 *it=sum;//编译错误

 it++;

}

作者观点

为了安全,不该给的不给,不该拿的不拿。做人如此,编程亦然。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表