当前位置:C++技术网 > 资讯 > vector容器的迭代器二三事

vector容器的迭代器二三事

更新时间:2016-01-22 23:49:25浏览次数:1+次

  在访问vector对象的元素时,除了使用下标方法,还可以使用迭代器。迭代器是一种检查容器内元素并遍历元素的数据类型。

下面以vector容器来介绍一下迭代器类型。

  迭代器也有数据类型,比如下面的定义:

vector<int>::iterator  iter;

这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。

  每种容器都定义了一对命名为beginend的函数,它们的作用是用于返回迭代器。这里用vector容器来进行说明。如果容器中没有元素,beginend返回的迭代器相同;如果容器非空,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)   

  在循环遍历容器的元素时,使用迭代器的自增自减,就可以不再使用下标,并且获得beginend操作返回的迭代器,在对容器元素进行操作时就不必再考虑容器的大小。

	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]

  迭代器的范围称为左闭合区间,令firstlast分别是beginend操作返回的迭代器,其标准表示方式为 [first, last ),表示范围从first开始,到last结束,但不包括last。迭代器last可以等于first,或者指向first标记的元素后面的某个位置,但绝对不能指向first标记的元素前面的元素。使用左闭合区间有两个方便使用的性质:

(1) 当firstlast相等时,迭代器范围为空;

(2) 当firstlast不相等时,迭代器范围内至少有一个元素,而且first指向该区间中的第一个元素。通过若干次自增运算可以使first的值不断增大,直到first==last为止。