- vector<int> :: const_iterator 表明这个迭代器它自身的值可以更改(可以指向其他的元素),但是不能通过对它解引用来改变它所指向的元素的值。 如果传递过来的是一个const类型的容器,那么只能使用const_iterator来进行遍历
- const vector<int>::iterator 表明这个迭代器本身就是一个const类型的,当声明该类型的迭代器时,必须要同时对它进行初始化,并且一旦被初始化,该迭代器本身的值就不能改变,不过能通过对该类迭代器进行解引用来改变它所指向的元素的值。
EX:
vector<int> ive;
vector<int>::const_iterator iter1 = ive.begin();
const vector<int>::iterator iter2 = ive.begin();
iter1 = iter1 + 1; // OK
iter2 = iter2 + 1; //Error
*iter1 = 10; //Error
*iter2 = 0; //OK
const_iterator可以用于const或者是非const容器,但是都不能通过对该种容器进行解引用来改变所指元素的值。
const iterator只能用于非const容器,只能修改其唯一指向的元素的值。
C++primier上的一个例子解释:
const vector<int> nines(10, 9);
// nines 被定义成常量容器对象,是说它本身是一个常量容器,而不是说它的内容常量对象,里面的内容只是int变量
const vector<int>::iterator cit2 = nines.begin();
// error: cit2是常型迭代器,但是它指向的元素是int的而不是 const int 的,所以它只是迭代器本身不能修改,但能修改它所指的元素(能修改它唯一指向的元素),但 是 nines 是一个 const 类型的容器,所以会产生编译错误
vector<int>::const_iterator it = nines.begin();
// ok: 迭代器 it 能修改自身的值,但是不能修改它所指向的元素,所以可以用 const 类型的容器 nines 来初始化该值
*it = 10;
// error: 它不能修改它所指向的元素的值,仅能修改本身的指向
++it;
// OK: 能修改自己的指向,通过自加指向原先的下一存储单元