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