erase() 関数を定義

iterator で指定した cell(データ)を削除する関数を定義します。

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

プログラムの説明

  1. Vector をテストする Main Program(VectorTest.cpp)です。
    "Vector.h" をインクルードします。
    int 型の配列 a[] に0~9の値を初期値として設定しています。
    a[] の配列の値を Vector v の初期値として格納して、関数 disp() で表示します。
    iterator it に8番目のデータ(7)を設定して v.erase() で削除します。
    キャパシティーとサイズを確認して下さい。
    /*★ Main Program  Step6    前田  稔 ★*/
    #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, a+10);
        Vector<int>::iterator it;
    
        cout << "v  ";
        disp(v);
    
        it= v.begin()+7;
        it= v.erase(it);
        cout << "erase v+7  ";
        disp(v);
        cout << "vのキャパシティー=" << v.capacity() << "  vのサイズ=" << v.size() << endl;
    }
    
  2. Vector Class を定義した Vector.h ファイルです。
    前回作成した Vector Class をベースにして、新しい機能を追加して行きます。
    iterator で指定した cell(データ)を削除する関数 erase() を追加します。
    リターン値として、削除された次の cell の iterator を返します。
    関数の Prototype 宣言は次のようになります。
    iterator erase(iterator itr);
  3. iterator で指定した cell(データ)を削除する関数 erase() を定義して下さい。
    Vector ではデータの領域は連続していなければなりません。
    従って itr 以降のデータを前に詰めて下さい。
    pop_back() は簡単ですが、erase() 関数はちょっと面倒です。
    一件削除するだけなので current_size; はデクリメントしますが、array_size はそのままでOKです。
        template<class T> typename Vector<T>::iterator Vector<T>::erase(iterator itr)
        {
            //※関数をコーディングして下さい。
        }
        

【演習】

  1. erase() を連続して使ってみましょう。
    リターン値として、削除された次の cell の iterator が返されるので v+7,v+8 が削除されます。
        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        Vector<int> v(a, a+10);
        Vector<int>::iterator it;
    
        it= v.begin()+7;
        it= v.erase(it);
        it= v.erase(it);
        cout << "erase v+7,v+8  ";
        disp(v);
    
        cout << "vのキャパシティー=" << v.capacity() << "  vのサイズ=" << v.size() << endl;
        
  2. erase() で範囲を指定して削除してみましょう。
    v+2~v+5 まで(2~4)までが連続して削除されます。
        int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        Vector<int> v(a, a+10);
        Vector<int>::iterator it;
     
        it= v.begin()+2;
        v.erase(it, it+3);
        cout << "erase v+2~v+5  ";
        disp(v);
        cout << "vのキャパシティー=" << v.capacity() << "  vのサイズ=" << v.size() << endl;
        
  3. first ~ last-1 のデータを削除する関数をコーディングして下さい。
    複数件の cell を一度に削除するので array_size を current_size+10; に resize して下さい。
        template<class T> typename Vector<T>::iterator Vector<T>::erase(iterator first, iterator last)
        {
            //※関数をコーディングして下さい。
        }
        
    次の erase() 関数を実行すると、全てのデータが削除されることを確認して下さい。
    erase(v.begin(), v.end());
  4. 登録されている全ての cell を削除する clear() 関数を追加します。
    erase() 関数を使うことも出来るのですが、もっと効率よくコーディング出来るはずです。
    void clear()
    {
    //※関数をコーディングして下さい。
    }

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