STL(Standard Template Library)

標準C++の最終草案は1997年にISO C++標準化委員会に承認されました。
標準C++が規定するのは言語仕様だけなく、C++標準ライブラリも規格の中で明確に定められています。
そのC++標準ライブラリの一部として組み入れられたのがSTL(Standard Template Library)です。
STL に定められている機能の中から Game Program を作成する上で必要だと思われるものを拾い出して説明します。

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

STL の便利な機能

  1. vector コンテナ
    vector とは配列のようなものですが、配列よりも柔軟性に富み、大きさをダイナミックに変更することが出来ます。
    1. push_back(x) で vector の末尾に x を追加します。
    2. pop_back() で vector の末尾の要素を削除します。
    3. insert(pos,x) で vector の pos の位置に x を挿入します。
    4. erase(pos) で vector の pos の要素を削除します。
    5. erase(first,last) で vector の first から last の直前までの要素を削除します。
    6. clear() で vector の全要素を削除します。
    7. begin() は vector の先頭要素を指す iterator です。
    8. end() は vector の末尾の要素+1を指す iterator です。
    9. resize() で大きさを設定(変更)することができます。
    10. size() で現在の大きさを知ることができます。
    11. vector は配列と同じように添え字で参照することも出来ます。
    12. vector の初期値
      vector vect1(5,(1,2,3,4,5));
      vector v1(3,123); //123, 123, 123
  2. list コンテナ
    list はセル(要素)を連鎖した構造で vector よりも、より柔軟性に富みます。
    「追加・挿入・削除・入替」などの操作では、vector では要素のシフトや入れ替えが行われるのに対して、list ではポインタの連鎖が変わるだけです。
    1. push_back(x) で list の末尾に x を追加します。
    2. pop_back() で list の末尾の要素を削除します。
    3. push_front(x) で list の先頭に x を追加します。
    4. pop_front(x) で list の先頭の要素を削除します。
    5. insert(pos,x) で list の pos の位置に x を挿入します。
    6. erase(pos) で list の pos の要素を削除します。
    7. erase(first,last) で list の first から last の直前までの要素を削除します。
    8. clear() で list の全要素を削除します。
    9. remove(x) は、x と等しいすべての要素を削除します。
    10. begin() は list の先頭要素を指す iterator です。
    11. end() は list の末尾の要素+1を指す iterator です。
    12. resize() で大きさを設定(変更)することができます。
    13. size() で現在の大きさを知ることができます。
    14. list は vector のように添え字で参照することは出来ません。
    Game Program では、list のセル(要素)として構造体を使うことが良くあります。
  3. deque コンテナ
    deque は Double Ended QUEue の略で、vector の伸長が末端方向のみであるのに対し、deque は先頭方向にも伸長されます。
    push_back(x) に加えて、先頭に挿入するメソッド push_front(x) が使えます。
    削除についても pop_back() に加えて pop_front() が使えます。
  4. set コンテナ
    set はソート関数を使わなくても、セル(要素)が常にソートされた状態で格納されています。
    新しいセルを追加すると、シーケンスを崩さないように順序を保って追加/挿入されます。
  5. string
    Win32API(C++ UnManeged Mode)では STL の string を使います。
    ヘッダー <string> に定義された文字列クラス basic_string は STL には含まれていないらしいのですが、STL と合わせて char* の代わりに非常によく使われます。
    basic_string は、連続領域に保持する vector のようなものと考えることが出来ます。
    1. string には、列の終端を表す null('\0') が格納されます。
      string s;
      s= "abcdefg";
      printf("string s の文字列は: %s\n",s.data());
    2. 代入や結合は算術型と同じように書くことが出来ます。
      string s1,s2;
      s1= s2;
      s1= s1+s2;
    3. 比較も算術型と同じように書くことが出来ます。
      string s1,s2;
      if (s1 == s2)  printf("s1 と s2 は等しい\n");
      if (s1 == "Message")  printf("s1 == Message\n");
    4. char[] から string に格納することが出来ます。
      char chr[]= "abcdefg";
      string str;
      str= chr;
    5. string から 算術演算が行える int に変換する場合です。
      string str= "123";
      int i;
      i= atoi(str.data());
    6. substr() で部分文字列を取り出します。
      size(), length() は文字列の長さを返す関数です。
      例えば、先頭と最後尾の文字を除いた文字列を取り出す場合は、次のようになります。
      string s1= "abcdefg";
      string s2;
      s2= s1.substr(1, s1.size()-2);
    7. 今までの書き方では確保した領域を超えてメモリを破壊する恐れがあります。
      string から char[] に格納する場合です。
      string str= "abcdefg";
      char chr[8];
      strcpy(chr,str.data());
      int 型の数値を string に変換する場合です。
      string str;
      int i= 123;
      char chr[4];
      sprintf(chr,"%d",i);
      str= chr;
      最近ではオーバーランをしないよう考慮した関数が strsafe.h で定義されています。
      詳細は Program Guid の文字列操作を参照して下さい。
  6. STL のプログラムは using namespace で std で宣言されたネームを使えるようにします。
    STL で定義されている標準的な名前は、scope 演算子 std:: を付けて定義されています。
    STL の具体的なプログラムは、この後のページを参照して下さい。
    using namespace std;
    
  7. Template 関数は template 関数 を参照して下さい。
    Template Class は Template Object Class を参照して下さい。

【NOTE】

STL をコマンドプロンプトの画面からコンパイルするときは CLI.BAT を使います。
CLI.BAT は Set UP から取得して下さい。

STL では名前が修飾されて非常に長くなり、警告メッセージが表示されることがあります。
警告について特定のコード分析を無効にする方法は Program Guid を参照して下さい。

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