汎用プログラミングとSTL学習ノートの反復器


汎用プログラミングとSTL学習ノートの反復器
iteratorとは?
iteratorはポインタの要約で、他のオブジェクトを指すオブジェクトです(ポインタだけでなく、ポインタは反復器の一種です).
まず2つの名詞を説明します
コンセプト:
conceptとは,ある型を記述する別の条件のセットである.
モデル:
ある型別がこのような条件をすべて満たすと、私たちはそれがconceptのモデルだと言います.
例えばint,char*はInput Iteratorのモデルである
Iteratorは汎用プログラミングにとって重要であるのは、アルゴリズムとデータ構造との間のインタフェースであるためである.すなわち、ポインタを一般化する方法は多く、それぞれの方法は異なるconceptである.
Iteratorは単に1つのconceptではなく、5つの異なるconceptsです.
Input Iterator:データへの読取り専用アクセスを提供
Output Iterator:データへの書き込み専用アクセスを提供
Forward Iterator:読み書き操作を提供し、反復器を前に押すことができます
Bidirectional Iterator:読み書き操作を提供し、前後に操作できる
Random Access Iterator:読み書き操作を提供し、データ内をランダムに移動できる
異なるコンテナクラスは、コンテナ内の要素にアクセスするための独自のiteratorタイプを定義します.すなわち、各コンテナはiteratorというタイプを定義し、このタイプは(概念的に)反復器の様々な動作をサポートする.
新しい名詞を見てみましょう
Refinement:concept C 2がconcept C 1のすべての機能を提供し、他の可能な追加機能を加えると、C 2はC 1のRefinementだと言います.
では、type間で共有されているのは、単純にインタフェースにすぎず、実装の詳細には関係ありません.
例えば、C 2はC 1のRefinementであり、T 3、T 4はC 2のmodelsであり、T 1とT 2はC 1のmodelsであり、T 3を意味するものではなく、T 4はT 1、T 2と特別な関係があるに違いない.
したがって,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;
}