container のデータを印字

container(コンテナ)に格納されている全てのデータを印字します。
void 型の関数に container を渡して、添え字で参照します。

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

プログラムの説明

  1. STL には各種 container に共通して、汎用的に使用出来るアルゴリズムが用意されています。
    アルゴリズムの例は STL でシャッフルする を参照して下さい。
    しかしながら、アプリケーションによってアルゴリズムが異なるのは当然です。
    ここでは STL で提供されているものと同様のアルゴリズムを開発する方法を説明します。
    プログラムの開発に当たっては、STL の基本的な知識が必要です。
  2. 最初に container に格納されている全てのデータを印字するアルゴリズム disp() を作成してみましょう。
    disp() 関数を呼び出す main() プログラムです。
    int 型の配列 a[] に0~9の値を格納して disp(a) を呼び出します。
    a[] は container ではありませんが、汎用アルゴリズムでは container と同じように扱うことが出来ます。
    /*★ Algorithm  Step1    前田  稔 ★*/
    #include <iostream>
    #include <vector>
    #include <list>
    using namespace std;
    
    void main()
    {
        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        // int a[] を表示
        cout << "a[]   ";
        disp(a);
    }
    
  3. container に格納されている全てのデータを印字する disp() 関数です。
    基本的には template 関数 の延長ですが、template 関数と違い操作の対象が container になります。
    <class Container> が呼び出し側から渡される型で Container で受け取ります。
    Container は一般的に使われている名前で、キーワードではありません。
    void は関数の型(戻り値)です。
    disp(const Container& c) で呼び出し側から渡されたパラメータ(今回は a)を受け取ります。
    & が付けられているので Container& c は reference(参照)になります。
    reference では実質的にポインタが使われるので、効率よく受け渡しすることが出来ます。
    reference の説明は 引数を reference で受け取る を参照して下さい。
    c で受け取る値は、実質的には int t[] の先頭ポインタ(アドレス)です。
    従って c[idx] のようにデータを添え字で参照することが出来ます。
    idx を0~9までループしていますが、汎用性を考慮するなら container のサイズもパラメータで渡すのでしょうか。 (^_^;)
    disp() を完成させてプログラムを実行してみて下さい。
    template<class Container>
    void
    disp(const Container& c)
    {
        for(int idx=0; idx!=10; idx++)
            //★cellのデータを印字して下さい。
        cout << endl;
    }
    

【演習】

  1. 次に vector<int> v に9~0の値を格納して disp(v) を呼び出します。
        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);
        
  2. disp(const Container& c) で呼び出し側から渡されたパラメータ(今回は v)を受け取ります。
    & が付けられているので Container& c は reference(参照)になります。
    c で受け取る値は、実質的には vector<int> v の先頭ポインタ(アドレス)です。
    従って、c[idx] のようにデータを添え字で参照することが出来ます。
        template<class Container>
        void
        disp(const Container& c)
        { ・・・ }
        
  3. 次は list で試してみて下さい。
    list の説明は STL の List を使って構造体を連鎖する を参照して下さい。
    配列や vector はデータを添え字で参照することが出来ますが list ではエラーになります。
    これでは「汎用的に使用出来るアルゴリズム」とは言えませんね。 (^_^;)
    どうすれば良いのでしょう。
        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);
        

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