C++/標準テンプレートライブラリ
表示
はじめに
[編集]標準テンプレートライブラリ(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は大きな進化を遂げています。コンセプトとレンジの導入により、より型安全で直感的なプログラミングが可能になりました。また、コルーチンやモジュールなどの新機能により、より柔軟なプログラミングモデルを実現しています。
特に注目すべき点は以下の通りです:
- レンジベースのアルゴリズムによる可読性の向上
- コンセプトによる型制約の明確化
- モジュールによる分割コンパイルの効率化
- コルーチンによる非同期プログラミングの簡略化