シーケンスを保って構造体リストに挿入する

STL の list にシーケンスを保って構造体を追加/挿入します。

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

プログラムの説明

  1. ゲームプログラムでは STL の list を使うと便利なことが多いのですが、STL の共通アルゴリズムは構造体には無力で 自分で作成しなければならないようです。 (^_^;
    このページでは STL の list にシーケンスを保って構造体を挿入するプログラムを紹介します。
  2. ヘッダファイルのインクルードと構造体の定義です。
    list を使うときは list をインクルードして下さい。
    using namespace で std で宣言されたネームを使えるようにします。
    BEST が構造体の定義で、key をキーにして構造体リストに追加/挿入します。
    BEST tbl[8] で list に登録するデータを定義しています。
        #include <stdio.h>
        #include <list>
        using namespace std;
    
        typedef struct
        {   int     key;
            char    name[20];
        }   BEST;
        BEST    tbl[8]=
        { { 5, "5abc" },  { 3, "3def" },  { 2, "2ghi" },  { 7, "7jkl" },
          { 4, "4mnop" }, { 3, "3xyz" },  { 8, "8uvw" },  { 1, "1qrst" },
        };
        
  3. シーケンスを保って構造体に追加/挿入する main() 関数です。
    algo_srh() で key をキーにして、list の挿入場所を求めます。
    パラメータとして、list の先頭と list の最後と関数オブジェクト(GreaterEqual)を渡します。
    tbl[i].key がコンストラクタに渡される値です。
    v.insert() で構造体を list に追加/挿入します。
    完成した list を printf() で表示します。
        void  main()
        {
            list<BEST>  v;
            list<BEST>::iterator it;
            int         i;
    
            for(i=0; i<8; i++)
            {   it= algo_srh(v.begin(),v.end(),GreaterEqual(tbl[i].key));
                v.insert(it, tbl[i]);
            }
            for(it=v.begin(); it!=v.end(); it++)    printf("%d  %s\n", it->key,it->name);
        }
        
  4. key をキーにして、挿入場所を求めるアルゴリズムです。
    op が関数オブジェクトで、class GreaterEqual の operator が呼び出されます。
    op(first) が真のとき first が挿入位置です。
        template <class T, class OP>
        T  algo_srh(T first, T last, OP op)
        {
            for(; first != last; first++)
                if (op(first)) return first;
            return last;
        }
        
  5. key を判定する関数オブジェクト GreaterEqual Object Class です。
    コンストラクタで比較の基準となる bench_ を保存します。
    operator には構造体のポインタ(p)が渡されます。
    p が指している key と基準値の比較結果をリターンします。
        class GreaterEqual
        {   int     bench_;
          public:
            GreaterEqual(int bench) : bench_(bench){}
            bool operator()(const list::iterator& p) const
            {
                return p->key >= bench_;
            }
        };
        

【演習】

プログラムを完成させて、key をキーにして追加/挿入されることを確認して下さい。
STL はC++に追加された機能の一部ですが、本体に負けないぐらいに「ややこしく」これだけでは何のことか解からないかも知れません。
ここではゲームプログラムの作成に必要かと思われる部分だけを紹介しています。
詳細は STL の専門書を参照して下さい。

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