汎用プログラミングと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:
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;
}