zoukankan      html  css  js  c++  java
  • const_iterator 与 const iterator

    const_iterator 与 const iterator

    const_iterator:
    C++为每种容器类型定义了一种名为const_iterator的类型,该类型只能用于读取容器内的元素,但不能改变其值。
    对const_iterator类型解引用,得到的是一个指向const对象的引用。
         for (vector<string>::const_iterator iter = text.begin(); iter != text.end(); ++ iter){
             cout << *iter << endl; //ok: print each element in text
             *iter = " ";     // error: *iter is const
         }

    const iterator:
    const的iterator和前者不一样,他指iterator本身是const,而非iterator指向的对象。
    因为iterator本身是const,所以声明的时候必须初始化,而且初始化后再不允许改变它的值(不能再指向其它元素)。
    注:这种const的iterator基本没啥用,因为一旦被初始化以后,只能改变他指向的唯一的指,不能指向其他元素,强烈不推荐使用。
         vector<int> nums(10);  // nums is nonconst
         const vector<int>::iterator cit = nums.begin();
         *cit = 1;               // ok: cit can change its underlying element
         ++cit;                  // error: can't change the value of cit

    const_iterator可以用于const或者非const容器(因为不能修改对象的值),但是const的iterator只能用于非const容器(只能修改唯一指向的值)。
         const vector<int> nines(10, 9);  // cannot change elements in nines
         // error: cit2 could change the element it refers to and nines is const
         const vector<int>::iterator cit2 = nines.begin();
         // ok: it can't change an element value, so it can be used with a const vector<int>
         vector<int>::const_iterator it = nines.begin();
         *it = 10; // error: *it is const
         ++it;     // ok: it isn't const so we can change its value

    以下是我从网上找到的详细的解释:
    const   vector  <int>   vec(10,10); 

    在上述语句中,你的vec被定义为一个常量容器对象!要注意的是,是常量容器对象,而不是常量对象的容器!
    (例如,不是vector <const int>!如下代码更易理解:
     
       typedef vector <int> _VECTOR;
       const _VECTOR vec(10,10);//常型对象,但其中的元素是int而不是const int!
    )

    但是,

    const   vector  <int> ::iterator   iter   =   vec.begin();

    在上述语句中,要注意的是,iter是一个常型迭代器,但其指向的数据对象是int而不是const int,其中的迭代器iter有修改vec成员的能力,这是语言特性所不允许的(关于常量对象的金科玉律是,任何修改常量对象的可能,都是语言所不容许的)!故上述语句产生编译期错误.

    const   vector  <int>   vec(10,10); 
    vector  <int> ::iterator   iter   =   vec.begin(); 

    和上一对语句同理,唯一的差别是,前一个iter是指向变量的常型迭代器,后一个iter是指向变量的可变值迭代器(非常型).

    所以,在如下语句中:

    vector  <int>   vec(10,10); 
    const   vector  <int> ::iterator   iter   =   vec.begin(); 

    好!vec不是一个常型对象,当然可以有一个可修改其成员的iter迭代器!

  • 相关阅读:
    Spring_HelloWorld
    【日记想法】2017年终总结
    【运维技术】从零开始搭建开发使用的Kafka环境
    【运维技术】windows安装apache服务器,实现域名对应端口的解析跳转
    【软件安装】Xshell + XFtp
    【运维技术】node项目使用strongloop进行部署相关教程
    【运维技术】CentOS7上从零开始安装LAMP安装织梦DedeCMS教程
    【运维技术】CentOS7上从零开始安装阿里RocketMQ版本:release-4.0.1【亲测哈哈】
    【运维技术】VM虚拟机上使用centos7安装docker启动gogs服务教程【含B站视频教程】
    【读书笔记】Junit实战
  • 原文地址:https://www.cnblogs.com/secbook/p/2655466.html
Copyright © 2011-2022 走看看