Menu
Coddy logo textTech

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は、十分にテストされ最適化された実装を提供しているため、一般的なデータ構造を再発明するのではなく、問題の解決に集中することができます。

challenge icon

チャレンジ

簡単

コンテナ、イテレータ、アルゴリズムを分離するという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. 1番目の整数
    2. 2番目の整数
    3. 3番目の整数
    4. 4番目の整数
    5. 検索する値

    std::vector<int> を作成し、最初の4つの整数を追加します。次に、以下の手順でSTLの哲学を実証します:

    1. Original: と出力した後、printVector を呼び出す
    2. Sorted: と出力した後、sortAndPrint を呼び出す
    3. 検索値を使用して findElement を呼び出す
    4. 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::sortstd::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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン