コンストラクタでデータを格納

配列に設定した値をコンストラクタで Vector に格納します。

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

プログラムの説明

  1. Vector をテストする Main Program(VectorTest.cpp)です。
    "Vector.h" をインクルードします。
    int 型の配列 a[] に0~9の値を初期値として設定しています。
    a[] の配列から2~7の値を Vector<int> v の初期値として格納して、関数 disp() で表示します。
    /*★ Main Program  Step5    前田  稔 ★*/
    #include <iostream>
    #include "Vector.h"
    using namespace std;
    
    void disp( Vector<int>& v )
    {
        //※この関数は iterator の説明 を参照して下さい。
    }
    
    void main()
    {
        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        Vector<int> v(a+2, a+8);
    
        cout << "v  ";
        disp(v);
    }
    
  2. Vector Class を定義した Vector.h ファイルです。
    前回作成した Vector Class をベースにして、新しい機能を追加して行きます。
    最初に「itr_first ~ itr_last-1」のデータを初期値として設定するコンストラクタを追加します。
    class Vector
    { public:
        typedef T* iterator;
        typedef T& reference;
    
        // コンストラクタ
        Vector( int vsize=0, const T& v=T() )
        {   array_size   = vsize;
            current_size = vsize;
            array        = new T[array_size+1];
            for(int i= 0; i<vsize; i++)     array[i] = v;
        }
    
        // 追加するコンストラクタ
        Vector( iterator itr_first, iterator itr_last )
        {
            //※コンストラクタをコーディングして下さい。
        }
    
  3. コンストラクタは次のように呼び出されます。
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Vector<int> v(a+2, a+8);
    これを受けて、初期値を設定するコンストラクタをコーディングして下さい。
    パラメータを itr_first と itr_last で受けます。
    「itr_last - itr_first」が格納する cell(データ)の件数です。
    end() のために一件多くの領域を割り当ててデータを格納します。

【演習】

  1. v.pop_back() で2件のデータを取り除いて、関数 disp() で表示してみましょう。
    pop_back() を実行する前に Vector が空でないことを v.empty() で確認します。
    pop_back() で取り除くとキャパシティーは変わりませんが、サイズが小さくなるので確認して下さい。
        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        Vector<int> v(a+2, a+8);
    
        cout << "v  ";
        disp(v);
    
        if (!v.empty()) v.pop_back();
        if (!v.empty()) v.pop_back();
        cout << "pop_back  ";
        disp(v);
    
        cout << "vのキャパシティー=" << v.capacity() << "  vのサイズ=" << v.size() << endl;
        
  2. 最後尾(current_size-1 番目)の cell を取く pop_back() 関数を追加します。
    関数の Prototype 宣言は次のようになります。
    void pop_back();
  3. pop_back() を実行する前に Vector が空でないことを確認する関数を追加します。
    empty() 関数は簡単なのでインライン関数として定義します。
    bool empty() const
    {
    //※関数をコーディングして下さい。
    }
  4. pop_back() 関数をコーディングします。
    この関数は、最後尾(current_size-1 番目)の cell を取り除くだけです。
    template<class T> void Vector<T>::pop_back()
    {
    //※関数をコーディングして下さい。
    }

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