STLの概要と理念
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 70/104。
標準テンプレートライブラリ(STL)は、一般的なデータ構造とアルゴリズムを提供する、テンプレートベースのクラスと関数の集合です。これまでに学んだテンプレートの概念を基盤として、STLは強力な設計思想を体現しています。それは、データの格納とデータの操作を分離することです。
STLは、連携して動作する3つの主要なコンポーネントを中心に構成されています。
| コンポーネント | 目的 | 例 |
|---|---|---|
| コンテナ | オブジェクトのコレクションを格納する | vector、map、set |
| イテレータ | コンテナのelementsへのアクセスを提供する | 入力、出力、ランダムアクセス |
| アルゴリズム | dataに対する操作を実行する | sort、find、transform |
重要なポイントは、アルゴリズムがコンテナを直接認識するのではなく、イテレーターを介して処理するということです。つまり、1つの 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の設計の強みです。アルゴリズムはコンテナから分離され、イテレータを介してのみ接続されています。
自分で試してみよう
#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: 検索値で findElement を呼び出す
// TODO: "Sum: " に続けて getSum の結果を出力する
return 0;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ