泛型编程与STL学习笔记之迭代器
什么是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; }