C++STL

STLについて

STL(Standard Template Library)とは

STLとは、テンプレートを利用した汎用クラスと汎用関数を提供するC++の標準ライブラリです。

STLを利用することで、標準的なデータ構造やアルゴリズムを容易に実装することができます。

また、STLはテンプレートで実装されているため、どのようなオブジェクトに対しても適用することができます。


STLは、主に以下三つの部分で構成されています。

  • データ構造を表すコンテナ(配列やリストなどオブジェクトを格納する)
  • コンテナをスキャンするためのイテレータ
  • コンテナに適用可能な各種アルゴリズム

STLコンテナについて

コンテナ(Container)とは

コンテナとは、C++のオブジェクト(変数)の入れ物です。

STLに標準で用意されているコンテナとして以下のものがあります。

コンテナ 意味 説明
vector 動的配列、一次元配列 実行時に配列の大きさを変えることができる配列です。
list 双方向リスト 双方向にアクセス可能な線形リストです。
queue キュー 先入れ先出し(FIFO)のキューです。
deque 双方向キュー、両端キュー コンテナの両端からアクセスできるキューです。
map 連想配列 キーと値の2つをペアとしてデータを格納します。
set 集合、セット ソートしながら要素を追加します。

この他、「priority_queue(優先順位付きキュー)」「stack」「mutimap(重複キー可能なマップ)」「multiset(データ重複可能なセット)」「bitset(true / falseを格納)」などがあります。


動的配列の例

動的配列を実現するにはvectorクラスを利用します。ヘッダファイルvectorを取り込みます。

「.push_back()」で配列末尾に要素を追加します。「.size()」で配列サイズを取得します。

通常の配列のように、要素を指定することでアクセスすることもできます。


#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;    // int型を格納する配列を宣言する

    v.push_back(123); // 要素を追加する
    v.push_back(456);
    v.push_back(789);

    printf("%d\n", v.size()); // 配列サイズを表示する
    printf("%d\n", v[2]);     // 配列要素へのアクセス

    return(0);
}

STLイテレータについて

イテレータ(iterator:反復子)とは

イテレータとは、繰り返し処理で一連の要素へアクセスする仕組みです。

C++におけるイテレータとは、コンテナ内の要素をスキャンするためのポインタのようなものです。

コンテナの内部構造やサイズを考慮することなく、データアクセスすることが可能となります。


各コンテナはbegin()とend()メソッドをもっているので、これを利用してコンテナ内の全要素にアクセスすることができます。


#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;              // 動的配列の定義
    vector<int>::iterator ptr ; // イテレータの定義

    v.push_back(123); // 要素を追加する
    v.push_back(456);
    v.push_back(789);

    // イテレータで配列要素を一覧出力
    for(ptr = v.begin(); ptr != v.end(); ptr++){
        printf("%d\n", *ptr);
    }

    return(0);
}

STLアルゴリズムについて

STLアルゴリズム

STLのアルゴリズムは、STLコンテナの各要素を対象とするように作られたグローバルなテンプレート関数です。(コンテナの種類ごとにメンバ関数として用意されている訳ではありません。)

アルゴリズムは、STLの他の要素(コンテナ、イテレータなど)と併用して動作することになります。

STLのアルゴリズムを利用する場合には「algorithm」ヘッダファイルをインクルードします。

STLのアルゴリズムは標準で定義されているものだけでも100以上が用意されています。(「stl アルゴリズム 一覧」などで調べることができます。)


動的配列の検索、挿入、削除アルゴリズム

find()を用いることで、データを保持する要素位置のポインタを取得できます。

insert()で要素の挿入を行い、erase()で要素の削除を行います。


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> v;              // 動的配列の定義
    vector<int>::iterator ptr ; // イテレータの定義

    v.push_back(123); // 要素を追加する
    v.push_back(456);
    v.push_back(789);

    // 挿入する
    ptr = find(v.begin(), v.end(), 456);    // 要素の検索
    if(ptr != v.end()) v.insert(ptr, 200);  // ptrの前に挿入する

    // 削除する
    ptr = find(v.begin(), v.end(), 789);    // 要素の検索
    if(ptr != v.end()) v.erase(ptr);        // ptr要素を削除する

    for(ptr = v.begin(); ptr != v.end(); ptr++) printf("%d\n", *ptr);
    return(0);
}

関連ページ