概要
STL (Standard Template Library) とは、C++ の(1998年に標準化された)標準ライブラリの1つです。 STL は、template という機能を用いた直交性の高いライブラリです。
template
templateは型をパラメータとして与えることで、任意の型に対応したコンテナやアルゴリズムを記述できる機能です。
例えば、2つの値のうち大きいほうを取り出す関数max()
を作りたいとします。int
型に限定したものなら簡単に作れて以下のようになります。
inline
int max(int x, int y)
{
return x > y ? x : y;
}
しかし、double
型や文字列に対して同じことをしたい場合、
改めてdouble
型用のものと文字列用のものを作る必要があります。
templateを用いるとこの問題を解決できます。
template版のmax()
関数は以下のようになります。
template<typename T>
inline
T max(const T& x, const T& y)
{
return x > y ? x : y;
}
template
というキーワードを用いてtemplate関数を定義します。
template
に続く <> の中に、パラメータとなる型を書きます。
こうすることで、int
型の変数を引数として呼び出せばint
型に対応したmax()
関数が自動的に生成され、double
型の変数を引数として呼び出せばdouble
型に対応したmax()
関数が自動的に生成されます。
C/C++言語では、長い間このような汎用の機能を汎用ポインター(void*
)や、マクロを使って行ってきました。
しかし、これらの機能は型安全性がなく、コンパイル時には発見できない潜在的なバグの原因になりやすいものです。
また、マクロにはデバッガによるデバッグを困難にするなどといった問題がありました。
しかし、templateを使うことで、型安全に汎用アルゴリズムを記述できるようになります。
直交性
配列のように複数の値を一まとめにして管理するクラスを コンテナクラスまたはコレクションクラスといいます。 コンテナクラスは、格納する型、格納する方式によってさまざまな種類があり、 整列、検索、置換などのさまざまな操作が考えられます。 以下に例を挙げてみます。
格納する型 |
int 型、double 型、文字列型
|
---|---|
格納方式 | 配列、可変長配列、連結リスト |
操作 | 整列、検索、置換 |
格納する型の種類が i 個、格納方式の数が j 個、操作の数が k 個あるとき、 これらのさまざまな種類のコンテナとその操作を個別に実装しようとすると、 全部で i×j×k 個のコードを書く必要があります。 それに対し、もし任意の型を格納できるコンテナがあり、任意の種類のコンテナを扱えるコンテナ操作関数があれば、i+j+k 個のコードを書くだけですみます。
前者は格納する型、格納方式、操作が相互に依存性を持っているため、i×j×k 個という大量のコードを書く必要があるわけです。 逆に、後者は格納する型、格納方式、操作に依存性がないため、i+j+k 個という少ないコードを書くだけですみます。 このようなコードの依存性のことを直交性といい、 依存性の少ないものを直交性が高いといいます。
STL
STLは、template機能を用いることで、直交性、汎用性が高く、型安全で高速なコンテナクラスおよびその操作を提供するライブラリです。
STLのコンテナクラスは >
などの演算子を適切に定義した任意の型を格納できます。
また、STLの規則に従って作ったコンテナクラスなら、任意のコンテナクラスがSTLの提供する操作関数を利用できます。
STL はその名前(Standard Template Library)が示すとおり、C++標準ライブラリに付属するライブラリです。 そのため、最新のC++の処理系には必ずSTLが付属しています。 ただし、STLが標準ライブラリとして採択されたのは1998年のことなので、古いC++処理系には付属していません。また、templateという機能自体が比較的新しいものなので、templateを完全に実装していない処理系も多々あります。