コンテンツにスキップ

C++/標準テンプレートライブラリ

出典: フリー教科書『ウィキブックス(Wikibooks)』
< C++
C++/STL から転送)

はじめに

[編集]

標準テンプレートライブラリ(Standard Template Library, STL)は、C++の標準ライブラリの一部であり、データ構造やアルゴリズムを効率的に扱うためのテンプレートクラスや関数を提供します。STLは、C++言語の特長であるテンプレート機能を活用して実装されており、汎用性と再利用性を高めることができます。

STLには、主に以下の3つのコンポーネントが含まれています。

コンテナ(Containers)
データの集合を扱うためのテンプレートクラスが含まれています。
シーケンスコンテナ
vector、array、deque、list、forward_list
連想コンテナ
set、map、unordered_set、unordered_map
コンテナアダプタ
stack、queue、priority_queue
アルゴリズム(Algorithms)
汎用的なデータ処理アルゴリズムを提供します。
ranges名前空間
C++20以降で導入された、より直感的なアルゴリズムインターフェース
並列アルゴリズム
並列実行ポリシーを使用した並行処理対応アルゴリズム
constexprアルゴリズム
コンパイル時実行可能なアルゴリズム
イテレータ(Iterators)
コンテナとアルゴリズムを橋渡しする抽象化された要素アクセス手段です。
入力イテレータ
前方向の読み取り専用アクセス
出力イテレータ
前方向の書き込み専用アクセス
前方イテレータ
多重パス可能な前方向アクセス
双方向イテレータ
前後方向のアクセス
ランダムアクセスイテレータ
任意位置への直接アクセス
連続イテレータ
メモリ上で連続した要素へのアクセス(C++20)

STLの現代的機能

[編集]
コンセプト(C++20)
テンプレートの型制約を表現する機能です。
標準コンセプト
ranges::iteratorやranges::rangeなど、標準ライブラリで定義された型制約
カスタムコンセプト
ユーザー定義の型制約を記述可能
レンジ(C++20)
より直感的なコンテナ操作を提供します。
レンジアダプタ
view::filterやview::transformなどの変換操作
レンジファクトリ
iota_viewやempty_viewなどの生成操作
スパン(C++20)
配列やメモリ領域への安全な参照を提供します。
所有権を持たない参照
メモリ領域の境界チェック機能付き
静的/動的サイズ
コンパイル時/実行時のサイズ指定

メモリ管理

[編集]
スマートポインタ
現代的なメモリ管理手法を提供します。
std::unique_ptr
排他的所有権を持つポインタ
std::shared_ptr
共有所有権を持つポインタ
std::weak_ptr
循環参照を防ぐ弱い参照
メモリリソース(C++17)
カスタムメモリアロケーションを実現します。
pmr名前空間
多態的メモリリソース機能
メモリプール
効率的なメモリ割り当て

並行処理サポート

[編集]
実行ポリシー
アルゴリズムの実行方法を制御します。
seq
逐次実行
par
並列実行
par_unseq
並列・ベクトル化実行
スレッド管理
マルチスレッドプログラミングをサポートします。
std::jthread
自動的なスレッド終了管理(C++20)
std::stop_token
協調的なスレッド停止機能(C++20)

特殊コンテナ(C++17以降)

[編集]
std::optional
値が存在しない可能性を表現
std::variant
型安全な共用体
std::any
任意の型の値を保持
std::string_view
文字列の効率的な参照

新しいアルゴリズム(C++20/23)

[編集]
範囲ベース
ranges名前空間で提供される直感的なアルゴリズム
並列処理対応
実行ポリシーによる並列化
constexpr対応
コンパイル時実行可能なアルゴリズム
文字列操作
starts_with、ends_with、containsなど

STLの利用例

[編集]
#include <iostream>
#include <ranges>
#include <vector>

auto main() -> int {
  // モダンなSTLの使用例
  std::vector<int> numbers = {1, 2, 3, 4, 5};
  auto even_numbers = numbers |
                      std::views::filter([](int n) { return n % 2 == 0; }) |
                      std::views::transform([](int n) { return n * 2; });
  for (auto x : even_numbers) {
    std::cout << x << " ";
  }
  std::cout << std::endl; // output: 4 8
}

注意点

[編集]
パフォーマンス考慮
適切なコンテナ選択
アルゴリズムの計算量理解
メモリアロケーション最適化
移植性
コンパイラサポート確認
実装依存の動作回避
C++バージョン互換性
現代のSTL
C++20以降、STLは大きな進化を遂げています。コンセプトとレンジの導入により、より型安全で直感的なプログラミングが可能になりました。また、コルーチンやモジュールなどの新機能により、より柔軟なプログラミングモデルを実現しています。

特に注目すべき点は以下の通りです:

  • レンジベースのアルゴリズムによる可読性の向上
  • コンセプトによる型制約の明確化
  • モジュールによる分割コンパイルの効率化
  • コルーチンによる非同期プログラミングの簡略化
これらの機能により、STLはより強力で使いやすいライブラリとなっています。