什么是iterator?
iterator是指针的概括物,它是用来指向其他对象的一种对象(它可不仅仅是指针哦,指针应该来说是迭代器的一种)
首先向大家阐明两个名词
concept(概念):
所谓concept,是一组描述某个型别的条件
model(模型):
当某个型别满足所有这样的条件,我们便说它是该concept的一个model
例如:int,char *便是Input Iterator的model
Iterator对于泛型编程之所以很重要,原因是它是算法与数据结构之间的接口,也就是说,有很多不同的方法可以将指针一般化,每一个不同的方法便是一个不同的concept.
Iterator不单单只是一个concept,而是五个不同的concepts:
Input Iterator:提供对数据的只读访问
Output Iterator:提供对数据的只写访问
Forward Iterator:提供读写操作,并能向前推动迭代器
Bidirectional Iterator:提供读写操作,并能向前向后操作
Random Access Iterator:提供读写操作,并能在数据中随机移动
不同的容器类定义了自己的iterator类型,用于访问容器内的元素。换句话说,每个容器定义了一种名为iterator的类型,而这种类型支持(概念上的)迭代器的各种行为。
下面来看一个新名词:Refinement
Refinement:如果concept C2提供concept C1的所有功能,再加上其他可能的额外功能,我们便说C2是C1的Refinement
那么,type之间所共享的,单纯只是个接口而已,无关乎任何实现细节。
例如,C2是C1的一个Refinement,而T3,T4是C2的models,T1和T2是C1的models,并不代表T3,T4一定与T1,T2之间有什么特别的关系。
因此,iterator不单是一个concept,而是一群彼此具有Refinement关系的concepts家族。
Input Iterator Output Iterator
\ /
\ /
\ /
\ /
Forward Iterator
|
|
|
Bidirectional Iterator
|
|
|
Random Access Iterator
这些不同的Iterator concepts提供了泛型算法一个自然分类法则。算法可以以其所采用之Iterator来分类。
迭代器应用实例:
example 1:
#include<iostream>
#include<vector>
#include<algorithm>
#include<ctime>
using namespace std;
void Display(vector<int> &v,const char *s);
int main(int argc,char *argv[])
{
srandom(time(NULL));
vector<int> collection(10);
for(int i=0;i<10;i++)
collection[i]=random()%10000;
Display(collection,"Before sorting:");
sort(collection.begin(),collection.end());
Display(collection,"After sorting:");
return 0;
}
void Display(vector<int> &v,const char *s)
{
cout<<s<<endl;
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"\t"));
cout<<endl;
}
example 2:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
double array[10]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9};
vector<double> vdouble(10);
int main(int argc,char *argv[])
{
vector<double>::iterator outIterator=vdouble.begin();
copy(array,array+10,outIterator);
while(outIterator!=vdouble.end())
{
cout<<*outIterator<<endl;
outIterator++;
}
return 0;
}
example 3:#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> intVector(100);
int main(int argc,char *argv[])
{
intVector[20]=50;
vector<int>::iterator intIter=
find(intVector.begin(),intVector.end(),50);
if(intIter!=intVector.end())
cout<<"Vector contains value "<<*intIter<<endl;
else
cout<<"Vector does not contain value 50"<<endl;
return 0;
}
原文:http://blog.csdn.net/u012736084/article/details/18941365