STL の List を使って構造体を連鎖する

STL(Standard Template Library) の list コンテナを使って構造体を連鎖し、挿入と削除を行います。

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

プログラムの説明

  1. STL はC++に標準装備されている拡張機能で、その中でも List コンテナはゲームに限らず良く使われる便利な機能です。
    今回は無数に発射される弾丸の制御に List コンテナを使用するその前段階の説明です。
  2. 最初にプログラムの実行結果から見ていただきましょう。
    1. 最初に7件の構造体を List に登録した状態です。
      3番は後から追加するために、空けています。
              1  val=10
              2  val=3
              4  val=5
              5  val=1
              6  val=9
              7  val=8
              8  val=7
              
    2. 3番の構造体を追加挿入して、8件の登録が揃った状態です。
              1  val=10
              2  val=3
              3  val=6
              4  val=5
              5  val=1
              6  val=9
              7  val=8
              8  val=7
              
    3. 2番の構造体を削除しました。
              1  val=10
              3  val=6
              4  val=5
              5  val=1
              6  val=9
              7  val=8
              8  val=7
              
  3. それではそのプログラムです。
    新規プロジェクトから、空の Console Application を作成して、プロジェクトに加えて下さい。
        /* STL List の追加と削除    前田 稔 */
        #include <stdio.h>
        #include <conio.h>
        #include <list>
        using namespace std;
    
        typedef struct
        {   int     n;
            int     val;
        }   STR;
        STR  tbl[]= {{1, 10}, {2,3}, {4,5}, {5,1}, {6,9}, {7,8} , {8,7}, {3,6} };
    
        list  lst;
        list::iterator p;
    
        void  print()
        {   for(p=lst.begin(); p!=lst.end(); p++)
                printf("%d  val=%d\n", p->n,p->val);
            printf("\n");
        }
    
        int main()
        {   int     i;
    
            for(i=0; i<7; i++)  lst.push_back(tbl[i]);
            print();
    
            //3番を追加
            p=lst.begin();
            p++; p++;           //3番目に設定
            lst.insert(p,tbl[7]);
            print();
    
            //2番を削除
            p=lst.begin();
            p++;                //2番目に設定
            q= p;               //2番目を保存
            p--;                //リンクを保つためにバック
            lst.erase(q);
            print();
    
            getch();
            return 0;
        }
        
  4. 今回は stdio.h を使ってみました。
    conio.h は表示を確認するための getch() 関数のヘッダファイルです。
    list を使うときは list をインクルードして下さい。
    using namespace で std で宣言されたネームを使えるようにします。
        #include <stdio.h>
        #include <conio.h>
        #include <list>
        using namespace std;
        
  5. STR 構造体の宣言とその定義です。
    先頭から7個は最初に List に登録するデータで8個目は後から List に追加するデータです。
        typedef struct
        {   int     n;
            int     val;
        }   STR;
        STR  tbl[]= {{1,10}, {2,3}, {4,5}, {5,1}, {6,9}, {7,8} , {8,7}, {3,6} };
        
  6. lst が STL の list の定義です。
    p は STL のイテレータです。配列で使う添え字と同じようなものと思って下さい。
        list  lst;
        list::iterator p;
        
  7. lst(STL の list) に登録されたデータを印字する関数です。
        void  print()
        {   for(p=lst.begin(); p!=lst.end(); p++)
                printf("%d  val=%d\n", p->n,p->val);
            printf("\n");
        }
        
  8. main() 関数です。
    最初に tbl[] で定義された7個の構造体を登録して、登録されたデータを印字します。
    次に3番のデータを追加挿入して、その結果を印字します。
    最後に2番のデータを削除して、その結果を印字しています。
    データを削除するときはリンクが途切れないように、一つ前の list に
        int main()
        {   int     i;
    
            for(i=0; i<7; i++)  lst.push_back(tbl[i]);
            print();
    
            //3番を追加
            p=lst.begin();
            p++; p++;           //3番目に設定
            lst.insert(p,tbl[7]);
            print();
    
            //2番を削除
            p=lst.begin();
            p++;                //2番目に設定
            lst.erase(p);
            print();
    
            getch();
            return 0;
        }
        

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