insert() 関数を定義

cell(データ)を挿入する insert() 関数を定義します。

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

プログラムの説明

  1. Vector の締めとして cell(データ)を挿入する insert() 関数を定義してみましょう。
    最初に STL の vector を使って cell(データ)を挿入する insert() 関数のテストを行います。
    vector<int> v に 14 と 17 を追加して、挿入したデータの確認を行います。
    こちらは本物の STL なので vector になっています。
    /*★ STL の vector class insert()   前田  稔 ★*/
    #include <iostream>
    #include <vector>
    using namespace std;
    
    void disp( vector<int>* v )
    {
        //※この関数は iterator の説明 を参照して下さい。
    }
    
    void main()
    {
        int a[] = { 13, 15, 16, 18, 19, 20 };
        vector<int> v(a, a+6);
        vector<int>::iterator it;
    
        cout << "v  ";
        disp(&v);
        cout << "vのキャパシティー=" << v.capacity() << "  vのサイズ=" << v.size() << endl;
    
        it = v.begin()+1;
        v.insert(it,14);
        it = v.begin()+4;
        v.insert(it,17);
        cout << "v  ";
        disp(&v);
        cout << "vのキャパシティー=" << v.capacity() << "  vのサイズ=" << v.size() << endl;
    }
    
  2. キャパシティーとサイズがどうなっているかも確認して下さい。

【演習】

  1. Vector.h を使って insert() 関数のテストを行う main() 関数を作成して下さい。
    こちらは class Vector なので間違えないようにして下さい。 (^_^;)
  2. Vector Class を定義した Vector.h ファイルに insert() 関数を追加して下さい。
    insert() 関数の頭の部分は次のようになります。
    template void Vector::insert(iterator itr, const T &x)
    {
        ・・・
    }
  3. Vector ではデータの領域は順番どおりに並んでいなければなりません。
    キャパシティーに追加する余裕があるときは、itr 以降のデータを後ろにシフトして、空いた所にセルを追加します。
    キャパシティーに追加する余裕が無いときは、ちょっと面倒です。
    iterator は index のように順番を示す数値では無くポインタです。
    従って resize() で新たな領域を確保すると iterator が示す領域は無効になります。
    次の手順に従って下さい。
    1. サイズを増やした新たな領域を確保します。
    2. 新しい領域に、先頭から itr-1 までのデータをコピーします。
    3. 次のセルに挿入するデータを格納します。
    4. 続けて itr から end() までのデータをコピーします。
    5. 古い領域を開放して、新しい領域を設定します。
    6. array_size と current_size を設定します。

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