• 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迭代器!

  • 相关阅读:
    如何做竞品分析报告
    软件架构入门
    系统内部矛盾的解决思路
    分表分库一
    Hbase随笔2
    Hbase随笔
    vertica在电信的应用
    理解RESTful架构
    百分点刘译璟
    数据产品的简介
  • 原文地址:https://www.cnblogs.com/secbook/p/2655466.html
Copyright © 2020-2023  润新知