STLの概要と設計思想
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 70/104。
Standard Template Library (STL) は、一般的なデータ構造とアルゴリズムを提供する、テンプレートベースのクラスと関数のコレクションです。これまで学んだテンプレートの概念に基づいて構築されたSTLは、データの保存とデータの操作を分離するという強力な設計哲学を体現しています。
STLは、相互に連携する3つの主要なコンポーネントを中心に構成されています。
| コンポーネント | 目的 | 例 |
|---|---|---|
| コンテナ | オブジェクトのコレクションを格納する | vector, map, set |
| イテレータ | コンテナの要素へのアクセスを提供する | 入力、出力、ランダムアクセス |
| アルゴリズム | データに対して操作を実行する | sort, find, transform |
重要な洞察は、アルゴリズムはコンテナを直接認識せず、イテレータを介して動作するということです。つまり、単一の sort アルゴリズムが、ベクタ、配列、および適切なイテレータ型を提供するあらゆるコンテナで動作することを意味します:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// 出力: 1 2 5 8 9
}この分離により、自由に組み合わせることが可能になります。つまり、新しいコードを記述することなく、互換性のある任意のコンテナで任意のアルゴリズムを使用できます。STLは、十分にテストされ最適化された実装を提供しているため、一般的なデータ構造を再発明するのではなく、問題の解決に集中することができます。
チャレンジ
簡単コンテナ、イテレータ、アルゴリズムを分離するというSTLの哲学を実証する、シンプルなデータ処理システムを構築しましょう。STLコンポーネントを扱うユーティリティモジュールと、それらがどのように組み合わされるかを示すメインプログラムを作成します。
次の2つのファイルを作成します:
DataProcessor.h: イテレータを介してSTLコンテナを操作するユーティリティ関数を定義し、STLの設計哲学を実証します。std::vector<int>&を受け取り、すべての要素をスペースで区切って出力し、最後に改行を出力するprintVectorという関数を作成してください。コンテナの走査にはイテレータ(begin()とend())を使用してください。std::vector<int>&を受け取り、std::sortを使用してソートした後、ソートされた要素をスペースで区切って出力し、最後に改行を出力するsortAndPrintという関数を作成してください。std::vector<int>&と検索するint値を受け取るfindElementという関数を作成してください。要素の特定にはstd::findを使用します。見つかった場合はFound: <value>と出力してください。見つからない場合はNot found: <value>と出力してください。std::vector<int>&を受け取り、すべての要素の合計を返すgetSumという関数を作成してください。これには、イテレータを使用したシンプルなループを使用できます。main.cpp: 入力を読み込み、STLコンポーネントがどのように連携するかを示します。5つの入力(それぞれ別の行)を読み込みます:
- 1番目の整数
- 2番目の整数
- 3番目の整数
- 4番目の整数
- 検索する値
std::vector<int>を作成し、最初の4つの整数を追加します。次に、以下の手順でSTLの哲学を実証します:Original:と出力した後、printVectorを呼び出すSorted:と出力した後、sortAndPrintを呼び出す- 検索値を使用して
findElementを呼び出す getSumを使用してSum: <result>と出力する
例えば、入力が 5, 2, 8, 1, 8 の場合:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16入力が 10, 30, 20, 40, 15 の場合:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100作成した関数がイテレータを介してベクトルを操作していること、そして std::sort や std::find が適切なイテレータ型を提供するあらゆるコンテナで動作することに注目してください。これがSTLの設計の力です。アルゴリズムはコンテナから切り離されており、イテレータを介してのみ接続されています。
チートシート
標準テンプレートライブラリ (STL) は、一般的なデータ構造とアルゴリズムを提供する、テンプレートベースのクラスと関数のコレクションです。これは、データの保存とデータの操作を分離します。
STLには3つの主要なコンポーネントがあります。
| コンポーネント | 目的 | 例 |
|---|---|---|
| コンテナ | オブジェクトのコレクションを格納する | vector, map, set |
| イテレータ | コンテナの要素へのアクセスを提供する | 入力、出力、ランダムアクセス |
| アルゴリズム | データに対して操作を実行する | sort, find, transform |
アルゴリズムはコンテナと直接やり取りするのではなく、イテレータを介して動作します。これにより、単一のアルゴリズムが互換性のある任意のコンテナで動作できるようになります。
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Sort using iterators
std::sort(nums.begin(), nums.end());
// Traverse using iterators
for (int n : nums) {
std::cout << n << " ";
}
// Output: 1 2 5 8 9
}一般的なイテレータのメソッド:
begin()- 最初の要素へのイテレータを返しますend()- 最後の要素の次の位置へのイテレータを返します
一般的なSTLアルゴリズム:
std::sort(begin, end)- 範囲内の要素をソートしますstd::find(begin, end, value)- 範囲内の値を検索します
自分で試してみよう
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// 入力から5つの整数を読み取る
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: vector を作成し、最初の4つの整数をそれに追加する
// TODO: "Original: " を出力し、 printVector を呼び出す
// TODO: "Sorted: " を出力し、 sortAndPrint を呼び出す
// TODO: searchValue を引数に指定して findElement を呼び出す
// TODO: "Sum: " に続いて getSum の結果を出力する
return 0;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス