iterator を渡す

iterator(イテレータ)を渡して、container のデータを印字します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 前回までの説明で、汎用性を持たせるには「container を渡したのではうまく行かない」ことが解っていただけたでしょうか。 (^_^;)
    今回は iterator を渡して container のデータを印字してみましょう。
    STL のアルゴリズムでも、その多くが iterator を渡しています。
    アルゴリズム disp() を呼び出す main() プログラムです。
    disp() 関数に int 型配列の iterator を渡して container に格納されているデータを印字します。
    /*★ Algorithm  Step1    前田  稔 ★*/
    #include <iostream>
    #include <vector>
    using namespace std;
    
    void main()
    {
        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        // int a[] を表示
        cout << "a[]   ";
        disp(a, a+10);
    }
    
  2. iterator を受け取ってコンテナコンテナのデータを印字するアルゴリズム disp() です。
    <class InputIterator> が呼び出し側から渡される型で InputIterator で受け取ります。
    InputIterator は一般的に使われている名前で、キーワードではありません。
    void は関数の型(戻り値)です。
    disp(InputIterator first, InputIterator last) で渡されたパラメータを受け取ります。
    first は印字を開始する cell(データ)の iterator で、last は「終了+1」の iterator です
    first++ で次のデータにポインタを移動します。
    このとき list は cell が連鎖されているので、iterator に対する演算子をオーバーロードして、連鎖をたどらなければなりません。
    first に格納されている iterator は、実質的にはデータを指し示すポインタです。
    従って first を通じてデータにアクセスすることが出来ます。
    disp() を完成させてプログラムを実行してみて下さい。
    template<class InputIterator>
    void
    disp(InputIterator first, InputIterator last)
    {
        while(first != last)
        {
            //★cellのデータを印字して下さい。
            ++first;
        }
        cout << endl;
    }
    

【演習】

  1. disp() 関数に vector の iterator を渡して container に格納されているデータを印字します。
        int t[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
        vector<int> v(t, t+10);
        // vector v を表示
        cout << "vector v   ";
        disp(v.begin(), v.end());
        
  2. 次は list の iterator を渡して container に格納されているデータを印字します。
        int t[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
        list<int> lst(t,t+10);
        // list lst[] を表示
        cout << "list lst   ";
        disp(lst.begin(), lst.end());
        
  3. 「int 型の配列/vector/list」の全てに対応していることを確認して下さい。
    配列やコンテナの一定の範囲を印字してみて下さい。

超初心者のプログラム入門(C/C++)