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

原创 2018年04月17日 19:26:01

const迭代器


先看下面的程序:


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++;

 }


省去了人工区分迭代器类型的麻烦,又不会妨碍const类型迭代器的功能。


更进一步


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


还有另外一种情况,数据本身不是const类型,但是从设计的角度来讲有些处理不应该修改该数据。这时也应该要求const类型的迭代器,以避免数据被意外修改。


C++11为此提供了cbegin和cend方法。

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,也可以防止对该数据的误操作。


作者观点


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


觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/craftsman1970/article/details/79979315

vector::cbegin (c++11)

//其实这个和begin差不多,只是具有了const属性,不能用于修改元素而已。 public member function std::vector::cbegin const_itera...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016-07-23 15:04:39
  • 633

实战c++中的vector系列--C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())

前面提到的emplace_back就是C++11所增加的内容。所以这篇博客就是想罗列一下C++11对vector容器的扩充。std::vector::cbegin和std::vector::cend ...
  • wangshubo1989
  • wangshubo1989
  • 2015-12-19 18:07:00
  • 4008

C++11特性--基于范围的for循环,新的STL容器,新的STL方法( cbegin(),cend(),crbegin(),crend())

1.模板和STL方面的修改 (1)基于范围的for循环    *对于内置数组以及包含方法begein()和end()的类合和STL容器,基于范围的for循环可简化为它们编写循环的工作    *如...
  • piniheaven
  • piniheaven
  • 2013-07-24 18:24:17
  • 1765

cbegin()和cend() -- 返回const_iterator对象

C++11开始,可以使用关键字auto代替迭代器的精确类型。 因此如果我们直接以begin()初始化迭代器,就可以使用auto声明其类型:for(auto pos = obj.begin(); po...
  • y396397735
  • y396397735
  • 2016-04-28 20:53:17
  • 641

begin( )和cbegin( )异同

1.iterator,const_iterator作用:遍历容器内的元素,并访问这些元素的值。iterator可以改元素值,但const_iterator不可改。跟C的指针有点像。 2.const_...
  • u010987458
  • u010987458
  • 2017-04-29 14:54:45
  • 580

c++11的10个新特性

C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布[2]  ,并于2011年9月出版。...
  • whatday
  • whatday
  • 2016-01-13 11:38:04
  • 1253

C++14新特性

【原文】https://zh.wikipedia.org/wiki/C%2B%2B14 C++14[编辑] C++14是C++的现行标准的非正式名称,正式名称为"International...
  • u012234115
  • u012234115
  • 2015-08-02 18:48:22
  • 2042

C++11新特性学习笔记—使用花括号就地初始化

这个特性是真正极好的!非常好用且方便!降低工作量!      如果一个类有很多成员变量A,B,C,D...,而且有很多不同版本的构造函数c1,c2,c3....,每个不同的构造函数可能会选择不同的成...
  • huiguimoyu
  • huiguimoyu
  • 2017-11-03 14:49:00
  • 200

cbegin(), cend() demo

#include #include #include using namespace std; int main() { vector ivec = { 1, 2, 3, 4 }; ...
  • sentinel911
  • sentinel911
  • 2015-03-07 13:54:22
  • 253

深入理解C++11:C++11新特性解析与应用

2.11模板函数的默认模板参数1、C++98中仅模板类支持默认参数,模板函数不支持默认参数,但C++11中模板类和模板函数均支持默认参数 2、模板类的默认参数,对C++98和C++11中,需遵循“从...
  • yagerfgcs
  • yagerfgcs
  • 2017-03-22 13:57:57
  • 973
收藏助手
不良信息举报
您举报文章:C++11新特性(10)- 容器的cbegin和cend函数
举报原因:
原因补充:

(最多只允许输入30个字)