在访问vector对象的元素时,除了使用下标方法,还可以使用迭代器。迭代器是一种检查容器内元素并遍历元素的数据类型。
下面以vector容器来介绍一下迭代器类型。
迭代器也有数据类型,比如下面的定义:
vector<int>::iterator iter;
这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
每种容器都定义了一对命名为begin和end的函数,它们的作用是用于返回迭代器。这里用vector容器来进行说明。如果容器中没有元素,begin和end返回的迭代器相同;如果容器非空,begin返回的迭代器指向vector的第一个元素,end返回的迭代器指向vector的末端元素的下一个,而不是末端元素。比如,定义vector<int> ivec(10),begin 操作返回的迭代器指向第一个元素ivec[0],end操作返回的迭代器不是指向ivec(9),而是ivec(9)的下一个,通常称为超出末端的迭代器,表明它指向了一个不存在的元素。
利用迭代器怎么获得所指向的元素呢?迭代器类型可以使用解引用操作符(*操作符)来访问迭代器所指向的元素:
vector<int>::iterator iter=ivec.begin();
通过*iter便可以修改容器中的第一个位置的元素值。
通过自增和自减操作可以将迭代器从一个元素移动到另一个元素
vector<int>::iterator iter=vect.begin(); //iter指向vect(0)
++iter; //iter指向vect(1)
在循环遍历容器的元素时,使用迭代器的自增自减,就可以不再使用下标,并且获得begin和end操作返回的迭代器,在对容器元素进行操作时就不必再考虑容器的大小。
for(vector<int>::size_type ix=0; ix != ivec.size(); ++ix)
ivec[ix] = 0;
这是一个用for循环将容器中的每个元素赋值为0,定义了一个索引ix,条件是ix不等于容器的大小。
使用迭代器的做法:
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0;
循环首先定义了指向容器第一个元素的迭代器iter,循环的条件是测试iter是否与end操作返回的迭代器不相等。不用再考虑容器的大小,当iter指向的最后一个元素处理完后,iter再增加1,便会与end操作返回的迭代器相等,此时循环终止。
vector容器支持通过元素位置实现随机访问,下标操作实现随机访问很好理解,通过迭代器实现随机访问是这样的形式:假如iter现在指向容器的第一个元素vect[0],那么iter+2所指向的是容器的第三个元素,即vect[2]。
迭代器的范围称为左闭合区间,令first和last分别是begin和end操作返回的迭代器,其标准表示方式为 [first, last ),表示范围从first开始,到last结束,但不包括last。迭代器last可以等于first,或者指向first标记的元素后面的某个位置,但绝对不能指向first标记的元素前面的元素。使用左闭合区间有两个方便使用的性质:
(1) 当first与last相等时,迭代器范围为空;
(2) 当first与last不相等时,迭代器范围内至少有一个元素,而且first指向该区间中的第一个元素。通过若干次自增运算可以使first的值不断增大,直到first==last为止。