const_iterator 与 const iterator

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:58   1658   0

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP