泛型编程与STL学习笔记之迭代器

泛型编程与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;
}






泛型编程与STL学习笔记之迭代器

上一篇:UML总结


下一篇:PXE无人值守安装系统