C++
 Computer >> コンピューター >  >> プログラミング >> C++

STLとC++標準ライブラリの違いを徹底解説!構成要素と特徴をわかりやすく整理

Standard Template Library(STL)は、C++プログラミング言語向けのソフトウェアライブラリであり、C++標準ライブラリの多くの部分に影響を与えました。STLは「アルゴリズム」「コンテナ」「関数オブジェクト」「イテレータ」という4つのコンポーネントを提供します。ただし注意したいのは、「STL」や「Standard Template Library」という用語はISO 14882 C++標準規格のどこにも登場しないという点です。つまり、C++標準ライブラリを「STL」と呼ぶのは厳密には誤りであり、両者は別のもの。STLはC++標準ライブラリの一部(部分集合)であると理解するのが正確です。

STLを構成する要素

コンテナ(Containers)

STLにはシーケンスコンテナと連想コンテナが含まれます。コンテナとは、データを格納するためのオブジェクトのことです。標準のシーケンスコンテナには vectordequelist があり、標準の連想コンテナには setmultisetmapmultimaphash_sethash_maphash_multisethash_multimap などがあります。
さらに、queuepriority_queuestack といったコンテナアダプタも提供されています。これらは特定のインターフェースを持つコンテナで、内部実装として他のコンテナを利用します。

イテレータ(Iterators)

イテレータとは、プログラマがコンテナ内を走査できるようにするオブジェクトです。STLでは5種類のイテレータが実装されています。

  • 入力イテレータ: 値のシーケンスを読み取るために使用
  • 出力イテレータ: 値のシーケンスに書き込むために使用
  • 前方イテレータ: 読み書きが可能で、前進できる
  • 双方向イテレータ: 前方イテレータと同様だが、後退も可能
  • ランダムアクセスイテレータ: 1回の操作で任意のステップ数だけ自由に移動できる

イテレータこそが、STLの汎用性を実現する中核的な機能となっています。

アルゴリズム(Algorithms)

STLのアルゴリズムは、要素の範囲(レンジ)に対して使用するために特別に設計された関数群です。範囲とは、イテレータやポインタを通じてアクセスできるオブジェクトのシーケンス全般を指し、配列やSTLコンテナのインスタンスなどが該当します。
STLアルゴリズムの代表例としては、sort(範囲内の要素をソート)、binary_search(ソート済みシーケンスに値が存在するか判定)、min_element(範囲内の最小要素を返す)などが挙げられます。これらのアルゴリズムは、テンプレート引数として受け入れられる任意のデータ型に適用できる点も大きな特徴です。

C++標準ライブラリとは

C++における標準ライブラリは、コア言語で記述され、C++ ISO標準そのものの一部を成すクラスと関数のコレクションです。C++標準ライブラリは、汎用コンテナ、それらを操作・利用するための関数、関数オブジェクト、汎用的な文字列やストリーム(対話I/OおよびファイルI/Oを含む)、一部の言語機能へのサポート、そして平方根の計算のような日常的なタスクのための関数などを提供します。以下に、C++標準ライブラリの主な機能を紹介します。

ストリーム(Streams)

C++で利用できるさまざまな種類のストリームを扱うためのライブラリ群です。たとえばファイルストリームは、ファイルの作成、ファイルへの情報の書き込み、ファイルからの情報の読み取りに使用できます。また文字列ストリームは、文字列を操作するためによく使われます。

コンテナ(Containers)

vectorsetmapstackqueue など、さまざまなデータ型のデータを格納するためのクラスのコレクションです。これらはSTLの構成要素でもあります。

汎用ライブラリ

algorithm、時刻を扱う chronoiteratormemory などのライブラリが含まれます。

数値計算ライブラリ(Numerics)

C++プログラムで数値・半数値的な演算を行うためのコンポーネント集です。たとえば <complex> は複素数を表現・操作するためのクラステンプレートと多数の関数を定義し、<random> は(疑似)乱数の生成に使用されます。

スレッド(Threading)

C++11で導入されたライブラリで、主に並行処理(コンカレンシー)を扱います。

C標準ライブラリ

C標準ライブラリの各ヘッダーは、拡張子「.h」を取り除き先頭に「c」を付けた名前で、C++標準ライブラリに組み込まれています。たとえば「time.h」は「ctime」になります。

まとめ

STLはコンテナ・イテレータ・アルゴリズム・関数オブジェクトという強力な部品を提供するライブラリであり、その思想はC++標準ライブラリに大きく取り入れられています。ただし「STL」という名称はISO標準には存在しないため、C++標準ライブラリ全体を指す言葉として使うのは避けるべきです。両者の関係と役割を正しく理解しておくことで、より適切に標準機能を使いこなせるようになるでしょう。

  1. C++における#defineとconstキーワードの違いとは?

    #defineとconstの基本的な違い#defineディレクティブはプリプロセッサディレクティブです。プリプロセッサは、コンパイラがソースコードを認識する前に、マクロをその定義内容で単純に置き換えます。イメージとしては、ソースコード全体に対して自動的に実行される「検索と置換」のようなものです。const変数の特徴一方、constによる変数宣言は、言語仕様上の実際の変数を宣言するものです。そのため、通常の変数と同じように扱うことができます。具体的には、以下のような操作が可能です。アドレスの取得(ポインタや参照への代入)関数への引数としての受け渡しキャストや型変換パフォーマンスとスコープの違いコ

  2. C++標準テンプレートライブラリ(STL)とは?4つの主要コンポーネントを解説

    C++の標準テンプレートライブラリ(STL:Standard Template Library)は、C++向けのソフトウェアライブラリであり、現在のC++標準ライブラリの多くの部分に大きな影響を与えました。STLは「アルゴリズム」「コンテナ」「関数(ファンクタ)」「イテレータ」という4つの構成要素を提供します。なお、「STL」や「Standard Template Library」という用語は、ISO 14882のC++標準規格には一切登場しません。そのため、C++標準ライブラリ全体を「STL」と呼ぶのは厳密には誤りです。STLはあくまでC++標準ライブラリの一部(サブセット)であり、両者は別