C++標準テンプレートライブラリ(STL)とは?4つの主要コンポーネントを解説
C++の標準テンプレートライブラリ(STL:Standard Template Library)は、C++向けのソフトウェアライブラリであり、現在のC++標準ライブラリの多くの部分に大きな影響を与えました。STLは「アルゴリズム」「コンテナ」「関数(ファンクタ)」「イテレータ」という4つの構成要素を提供します。
なお、「STL」や「Standard Template Library」という用語は、ISO 14882のC++標準規格には一切登場しません。そのため、C++標準ライブラリ全体を「STL」と呼ぶのは厳密には誤りです。STLはあくまでC++標準ライブラリの一部(サブセット)であり、両者は別の概念として理解する必要があります。
以下、STLを構成する主要な要素について詳しく見ていきましょう。
1. コンテナ(Containers)
コンテナとは、データを格納・管理するためのオブジェクトです。STLのコンテナは大きく分けて「シーケンスコンテナ」と「連想コンテナ」の2種類があります。
シーケンスコンテナ
要素を順序どおりに保持するコンテナで、代表的なものとして vector、deque、list が挙げられます。
連想コンテナ
キーと値を関連付けて管理するコンテナで、set、multiset、map、multimap、さらにハッシュベースの hash_set、hash_map、hash_multiset、hash_multimap などがあります。
コンテナアダプタ
このほかに、既存のコンテナを内部実装として利用し、特定のインターフェースだけを提供する「コンテナアダプタ」も用意されています。代表例は queue、priority_queue、stack です。
2. イテレータ(Iterators)
イテレータとは、コンテナ内の要素を走査(トラバース)することを可能にするオブジェクトです。STLでは次の5種類のイテレータが定義されています。
- 入力イテレータ: 値の並びを読み取るために使用
- 出力イテレータ: 値の並びを書き込むために使用
- 前方イテレータ: 読み書きが可能で、前方向へのみ移動できる
- 双方向イテレータ: 前方イテレータの機能に加え、後ろ方向への移動も可能
- ランダムアクセスイテレータ: 1回の操作で任意のステップ数だけ自由に移動できる
イテレータこそが、STLの持つ汎用性(どんなコンテナにも同じ手法を適用できる柔軟性)を実現する中核的な機能といえます。
3. アルゴリズム(Algorithms)
STLのアルゴリズムは、要素の範囲(レンジ)に対して動作するよう特別に設計された関数群です。ここでの「範囲」とは、イテレータやポインタを通じてアクセスできるオブジェクトの連なり全般を指し、配列や各種STLコンテナがこれに該当します。
代表的なアルゴリズムの例は以下のとおりです。
sort:指定範囲の要素をソートするbinary_search:ソート済みのシーケンスに特定の値が存在するかを判定するmin_element:範囲内の最小要素を返す
これらのアルゴリズムはすべてテンプレートとして実装されているため、任意のデータ型に対して適用できる点が大きな特徴です。
まとめ
STLは「コンテナ」「イテレータ」「アルゴリズム」「関数(ファンクタ)」という4つの要素を組み合わせることで、効率的かつ汎用的なプログラミングを可能にする強力なライブラリです。C++標準ライブラリの中核技術として広く活用されているため、C++開発者にとって必須の知識といえるでしょう。
-
C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード
C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス
-
C++ STL(標準テンプレートライブラリ)のプライオリティキュー徹底解説
プライオリティキュー(優先度付きキュー)は、優先度を持つ要素のコレクションを格納するための抽象データ型(ADT)です。各要素は優先度に基づいて挿入・削除が行われ、最も優先度の高い要素はいつでも取り出すことができます。スタックやキュー、リストなどの線形データ構造とは異なり、プライオリティキューは要素を格納位置の順序ではなく、優先度に基づいて管理する点が大きな特徴です。C++では、STLの <queue> ヘッダで提供されており、デフォルトでは最大値が先頭に来る構造になっています。プライオリティキューがサポートする主な操作size() — プライオリティキュー内の要素数を返し、サイズを