现在的位置: 首页 > 综合 > 正文

const_iterator 与 const iterator 【转】

2012年09月15日 ⁄ 综合 ⁄ 共 1824字 ⁄ 字号 评论关闭

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

【上篇】
【下篇】

抱歉!评论已关闭.