C++:反復器Iterator詳細

7645 ワード

文書ディレクトリ
  • 反復器紹介
  • STLの5種類の反復器タイプ
  • Forward IteratorとInputとOutputの違い
  • 反復器の紹介
    用途:ポインタはストレージ空間の連続したデータ構造を遍歴するために使用できますが、ストレージ空間の非連続的な場合は、非配列のデータ構造を遍歴するためにポインタのような動作をするクラスを探す必要があります.
    定義:反復器は、コンテナ内の要素を検査し、要素を巡回するデータ型であり、1つのコンテナ内のオブジェクトへのアクセス方法(各コンテナタイプはvector:vector< int>:: iterator iter;などの独自の反復器タイプを定義し、コンテナ内のオブジェクトの範囲を定義します.
  • 反復器とポインタ:反復器(Iterator)はポインタ(pointer)の汎化であり、オブジェクトへの間接アクセスを提供する.反復器はコンテナ、ポインタタイプは配列です.
  • 反復器とテンプレート:テンプレートは、アルゴリズムを格納されたデータ型から独立させ、すなわち、プログラム設計を任意のデータ型で使用することができる.反復器は、アルゴリズムを使用するコンテナタイプとは独立させ、すなわち、任意のコンテナタイプがこの汎用的な方法を使用することができる.

  • 各コンテナには独自の反復器が定義されています.次の例ではvectorとその反復器に適用されます(他のコンテナの反復器の使い方はブログ:C+:各コンテナの反復器の使い方を参照).
    #include 
    #include 
    using namespace std;
     
    int main()
    {
       //          int
       vector<int> vec; 
       int i;
     
       //    vec      
       cout << "vector size = " << vec.size() << endl;
     
       //    5       
       for(i = 0; i < 5; i++){
          vec.push_back(i);
       }
     
       //    vec       
       cout << "extended vector size = " << vec.size() << endl;
     
       //        5   
       for(i = 0; i < 5; i++){
          cout << "value of vec [" << i << "] = " << vec[i] << endl;
       }
     
       //       iterator    
       vector<int>::iterator v = vec.begin();
       while( v != vec.end()) {
          cout << "value of v = " << *v << endl;
          v++;
       }
     
       return 0;
    }
    

    STLの5種類の反復器タイプ
  • Input Iterators(入力):入力反復器に対する参照を解除します(ポインタ*iterと同様).最も厳密な入力反復は、オブジェクトに読み取り専用でのみアクセスでき、通常、標準入力デバイス(キーボード)がデータを読み出す場合に発生します.例:istream.注意:一歩前進するしかありません.つまり、増加するしかありません.
  • Output Iterators(出力):Input Iteratorsと似ていますが、参照を解除するだけでコンテナの値*iter=valueを変更でき、読み取れず、1回しか書き込みできません.通常、標準出力装置(プリンタまたはスクリーン)にデータを書き込むときに発生します.単一ステップ前方反復器にも属します.
  • Forward Iterators(順方向):読み書き可能、単一ステップ前進.
  • Bidirectional Iterators(双方向):Forward Iterators+単一ステップ後方.
  • Random Access Iterators(ランダムアクセス):上記のすべての反復器機能を集合し、ポインタのように算術計算を行うことができます.

  • を選択します.
    使用可能なアクションのリスト
    Input:前方に遍歴し、読み取り専用で、要素を一度だけ読み込むことができます.
    *iter:対応する要素への読み取り専用アクセス
    iter->member:対応する要素に読取り専用でアクセスするメンバー
    ++iter:一歩前進(最新の位置に戻る)
    iter+:一歩前進(元の位置に戻る)
    iter 1==iter 2:2つの反復器が等しいか否かを判断する
    iter1 != iter 2:2つの反復器が等しくないかどうかを判断する
    TYPE(iter):複製反復器
    Output:前に遍歴し、書くだけで、要素を一度だけ書き込むことができます.
    *iter=value:対応する要素に新しい値を書き込む
    ++iter:一歩前進(最新の位置に戻る)
    iter+:一歩前進(元の位置に戻る)
    TYPE(iter):複製反復器
    Forward:要素ごとに前へ、読み書き可能、アクセス可能な要素を複数回
    *iter:; iter->member;++iter; iter++; iter1 == iter2; iter1 != iter2; TYPE(); TYPE(iter); iter1 = iter2
    Bidirectional:要素ごとに前後
    ++iter; iter++;
    Random Access
    Bidirectional Iteratorのすべてのコンピテンシーフィーチャー
    iter[n]:インデックスがnの要素に直接アクセス
    iter+=n:n個の要素を前後(nは負)に遍歴する
    iter-=n:n個の要素を前後または前方(nは負)に遍歴する
    iter+n(n+iter):現在位置の後ろのn番目の要素のiterator位置を返します.
    iter-n:現在位置の前のn番目の要素のiterator位置を返します
    iter 1-iter 2:iter 1とiter 2の間の距離を返す(distance)
    iter1
    iter 1>iter 2:iter 1がiter 2の後か否かを判断する
    iter 1<=iter 2:iter 1がiter 2からなくなったか否かを判断した後
    iter 1>=iter 2:iter 1がiter 2を終了しないか否かを判断する前に
    Forward IteratorとInputとOutputの違い
  • Output Iteratorがデータを書き込んだ場合、末尾に達したかどうかはチェックされません.
  • Forward Iteratorは、アクセス要素の有効性を保証する必要があります.