迭代器 Iterator
迭代器与容器
通过迭代器,我们可以用相同的方式来访问、遍历容器 (每种容器必须提供自己的迭代器) [泛型抽象]
迭代器是一个“可遍历STL容器内全部或部分元素”的对象。
一个迭代器指出容器中的一个特定位置。
具有遍历复杂数据结构的能力。
不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。
不同的算法需要不同的迭代器的能力;
相同的算法需要根据迭代器的能力不同而做相应的优化
因此尽管算法里已经有Sort功能,但是List还是提供了自己的sort成员函数
我们有充分的理由相信List的Sort更高效,因为这个Sort是针对List的迭代器进行优化的。
1. 迭代器的基本操作
l Operator *
传回当前位置上的元素值。直接以operator->取用他们
l Operator ++
将迭代器推到下一个元素,有些也可以支持—
l Operator== 和 Operator!=
判断两个迭代器是否在一个位置
l Operator =
为迭代器赋值
2. 迭代器的分类
Input iterator:read only不能改变iterator所指对象
Output iterator:write only
Forward iterator:单向迭代器,iter++
Bidirectional iterator:双向迭代器,iter++、iter--
Random access iterator:所有指针的运算能力,p+n, p-n, p[n], p1-p2, p1<p2
input iterator output iterator
forward iterator
bidirectional iterator
random iterator
一个例子--advance()
Template <class InputIterator,class Distance)
Void advance_II(InputIterator& I, Distance n)
{
For( ; n>0; --n,++i); //单向,逐一前进
}
Template <class BidirectionalIterator, class Distance>
Void advance_BI(BidirectionalITterator& i,Distance n)
{
if (n>=0) //双向,逐一前进
For(;n>0;--n,++i){}
else
For(;n<0;++n,--i){}
}
Template<class RandomAccessIterator,class Distance>
Void advance_RAI(RandomAccessIterator& I,Distance n)
{
i+=n; //随机,跳跃前进
}
迭代器的traits编程技法
3. Iterator adaptor(迭代器配接器)
概念
提供和iterator相同的接口,但是改变内部的实现方法。
分类
Insert iterator
Stream iterator
Reverse iterator
Insert(安插型)iterator
List<int> coll1;
for(int i = 1; i<=4; ++i)
coll1.push_back(i);
……
Copy(coll1.begin(),coll1.end(),back_inserter(coll2));
Copy(coll1.begin(),coll1.end(),front_inserter(coll3));
Copy(coll1.begin(),coll1.end(),inserter(coll4,coll4.begin());
Result:
1,2,3,4
4,3,2,1
1,2,3,4