Iterator(迭代器)

1、迭代器的作用

  • 可遍历STL容器内全部或部分元素的对象
  • 指出容器中的一个特定位置
  • 所有容器都提供两种迭代器:container::iterator以“读/写”模式遍历元素,     container::const_iterator以“只读”模式遍历元素
  • 迭代器示例:iterator

  • 能够让迭代器与算法不干扰的相互发展,最后又能够无间隙的粘合起来。
  • 重载了*,++,==,!=,=运算符,用以操作复杂的数据结构
  • 容器提供迭代器,算法使用迭代器

2、迭代器的基本操作

操作 效果
* 返回当前位置上的元素值。如果该元素有成员,可以通过迭代器以operator ->取用                                                                           
++ 将迭代器前进至下一元素
==和!= 判断两个迭代器是否指向同一位置
= 为迭代器赋值(将所指元素的位置赋值过去)

3、迭代器的分类

  • 不同容器提供自己的迭代器,所以不同迭代器具有不同的能力

  • 不同的算法根据需要不同的迭代器的能力,相同的算法需要根据迭代器的能力不同而做相应的优化

(1)双向迭代器

  • 可以双向行进,以递增运算前进或以递减运算后退。
  • list、set和map提供双向迭代器

(2)随机存取迭代器

  • 除了具备双向迭代器的所有属性,还具备随机访问能力
  • 可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用<和>之类的关系运算符比较两个迭代器。
Vector<int> v; 
for(pos=v.begin();pos<v.end();++pos{
	…
 }
  • vector、deque和string提供随机存取迭代器

举例:

#include <iostream>
#include <list>
#include <vector>
#include <set>
using namespace std;

template<class InputIterator, class Distance>
void advence_II(InputIterator &i, Distance n)
{
	for (; n > 0; --n;++i);  //单向,逐一前进
}
template<class BidirectionslIterator, class Distance>
void advence_II(BidirectionslIterator &i, Distance n)
{
	if (n >= 0)  //双向,逐一前进
		for (; n>0; --n, ++i);
	else
		for (; n<0; ++n, --i);
}
template<class RandomAccessIterator, class Distance>
void advence_II(RandomAccessIterator &i, Distance n)
{
	i += n;  //随机,跳跃前进
}
void main()
{
	system("pause");  
}  

3、迭代器的相关类型

  • 有些算法内部需要用到迭代器所代表元素的类型,这个就是迭代器的相关类型
  • 迭代器的traits编程技法
  • 用来扩充容器与算法

猜你喜欢

转载自blog.csdn.net/zhizhengguan/article/details/81382421
今日推荐