Menu
Coddy logo textTech

STLの概要と理念

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 70/104。

標準テンプレートライブラリ(STL)は、一般的なデータ構造とアルゴリズムを提供する、テンプレートベースのクラスと関数の集合です。これまでに学んだテンプレートの概念を基盤として、STLは強力な設計思想を体現しています。それは、データの格納とデータの操作を分離することです。

STLは、連携して動作する3つの主要なコンポーネントを中心に構成されています。

コンポーネント目的
コンテナオブジェクトのコレクションを格納するvectormapset
イテレータコンテナのelementsへのアクセスを提供する入力、出力、ランダムアクセス
アルゴリズムdataに対する操作を実行するsortfindtransform

重要なポイントは、アルゴリズムがコンテナを直接認識するのではなく、イテレーターを介して処理するということです。つまり、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 は十分にテストされ最適化された実装を提供するため、一般的なデータ構造を再発明するのではなく、問題の解決に集中できます。

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>を出力する

たとえば、入力が52818の場合:

Original: 5 2 8 1 
Sorted: 1 2 5 8 
Found: 8
Sum: 16

入力が1030204015の場合:

Original: 10 30 20 40 
Sorted: 10 20 30 40 
Not found: 15
Sum: 100

関数がイテレータを通じてベクターと連携していること、そしてstd::sortstd::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;
}
quiz icon腕試し

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

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

自分で練習してみよう: C++オンラインコンパイラ