C++のstd::algorithmヘッダで学ぶ汎用アルゴリズムの活用法

C++標準ライブラリのstd::algorithmヘッダには、多くの汎用アルゴリズムが含まれており、プログラミングの効率を飛躍的に向上させます。この記事では、std::algorithmヘッダの基本的な機能を紹介し、それぞれのアルゴリズムがどのように活用できるかを具体的な例を交えながら解説します。初心者から中級者まで、C++プログラミングの理解を深めるために役立つ情報を提供します。

目次

std::algorithmとは?

C++の標準ライブラリには、データの操作や変換を効率的に行うための多数の汎用アルゴリズムが含まれています。その中でも、std::algorithmヘッダは特に重要です。このヘッダには、ソート、検索、変換、集計などの多様な操作を行う関数が含まれており、これらを使用することでコードの再利用性と可読性が向上します。

std::algorithmの利点

  • 再利用性の向上:標準ライブラリのアルゴリズムを使用することで、同じ操作を複数回コーディングする手間が省けます。
  • 可読性の向上:std::algorithmの関数は明確で理解しやすい名前を持っており、コードの意図が伝わりやすくなります。
  • 効率性:標準ライブラリのアルゴリズムは、多くの場合最適化されており、パフォーマンス面でも優れています。

std::algorithmヘッダに含まれる主な関数

std::algorithmヘッダには、以下のような主要な関数が含まれています。

  • std::sort:範囲内の要素をソートします。
  • std::find:範囲内の指定された値を検索します。
  • std::transform:範囲内の要素を変換します。
  • std::accumulate:範囲内の要素を集計します。
  • std::for_each:範囲内の各要素に対して操作を行います。
  • std::copy:範囲内の要素を別の範囲にコピーします。

これらの関数を活用することで、C++プログラムの品質と開発効率を大幅に向上させることができます。

std::sortの活用法

std::sortは、C++標準ライブラリで提供される非常に便利なソート関数です。この関数は、指定された範囲内の要素を昇順にソートします。使い方もシンプルで、わずかなコードで強力なソート機能を実現できます。

基本的な使い方

std::sortを使うためには、まずalgorithmヘッダをインクルードする必要があります。以下のコードは、整数のベクターをソートする基本的な例です。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    std::sort(vec.begin(), vec.end());

    for(int n : vec) {
        std::cout << n << " ";
    }
    return 0;
}

このコードでは、ベクターvecの要素が昇順にソートされ、結果として1 2 5 5 6 9が出力されます。

カスタム比較関数を使用したソート

std::sortはデフォルトで昇順にソートしますが、カスタム比較関数を指定することで任意の順序でソートできます。例えば、降順にソートする場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

bool compare(int a, int b) {
    return a > b;
}

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    std::sort(vec.begin(), vec.end(), compare);

    for(int n : vec) {
        std::cout << n << " ";
    }
    return 0;
}

このコードでは、compare関数を指定することでベクターvecの要素が降順にソートされ、結果として9 6 5 5 2 1が出力されます。

構造体やクラスのソート

std::sortは、単純なデータ型だけでなく、構造体やクラスのオブジェクトをソートすることもできます。その場合、カスタム比較関数を使ってソート基準を指定します。

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
};

bool compareByAge(const Person &a, const Person &b) {
    return a.age < b.age;
}

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};

    std::sort(people.begin(), people.end(), compareByAge);

    for(const auto &person : people) {
        std::cout << person.name << " (" << person.age << ") ";
    }
    return 0;
}

このコードでは、Person構造体の年齢でソートを行い、結果としてBob (25) Alice (30) Charlie (35)が出力されます。

std::sortを活用することで、様々なデータのソート処理を効率的に行うことができます。次はstd::find関数の活用法を見ていきましょう。

std::findの活用法

std::findは、指定された範囲内で特定の値を検索するための関数です。これはC++標準ライブラリのalgorithmヘッダで提供されており、効率的な検索処理を簡単に実装できます。

基本的な使い方

std::findを使うためには、algorithmヘッダをインクルードし、検索範囲の開始位置と終了位置、そして検索する値を指定します。以下のコードは、整数のベクターから特定の値を検索する基本的な例です。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    auto it = std::find(vec.begin(), vec.end(), 9);

    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Not Found" << std::endl;
    }
    return 0;
}

このコードでは、ベクターvec内で値9を検索し、見つかった場合はその値を表示します。見つからない場合は”Not Found”と表示されます。

カスタム比較関数を使用した検索

std::find_if関数を使うと、カスタム比較関数を指定して検索条件をカスタマイズできます。例えば、偶数の値を検索する場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

bool isEven(int n) {
    return n % 2 == 0;
}

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    auto it = std::find_if(vec.begin(), vec.end(), isEven);

    if (it != vec.end()) {
        std::cout << "Found even number: " << *it << std::endl;
    } else {
        std::cout << "Even number not found" << std::endl;
    }
    return 0;
}

このコードでは、isEven関数を指定してベクターvec内で最初の偶数を検索し、見つかった場合はその値を表示します。

構造体やクラスの検索

std::find_ifを使うと、構造体やクラスのオブジェクトを検索することもできます。例えば、Person構造体のオブジェクトを名前で検索する場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
};

bool findByName(const Person &person, const std::string &name) {
    return person.name == name;
}

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
    std::string nameToFind = "Bob";

    auto it = std::find_if(people.begin(), people.end(), [&](const Person &person) {
        return findByName(person, nameToFind);
    });

    if (it != people.end()) {
        std::cout << "Found: " << it->name << " (" << it->age << ")" << std::endl;
    } else {
        std::cout << "Person not found" << std::endl;
    }
    return 0;
}

このコードでは、findByName関数を使って名前BobのPersonオブジェクトを検索し、見つかった場合はその情報を表示します。

std::findとstd::find_ifを活用することで、さまざまなデータセットから特定の値や条件に合致する要素を効率的に検索することができます。次はstd::transform関数の活用法を見ていきましょう。

std::transformの活用法

std::transformは、指定された範囲の要素に対して変換操作を行い、その結果を別の範囲に格納するための関数です。これにより、データの変換や操作を効率的に実行することができます。

基本的な使い方

std::transformを使うためには、algorithmヘッダをインクルードし、変換元の範囲と変換先の範囲、そして変換関数を指定します。以下のコードは、整数のベクターの要素をすべて2倍に変換する基本的な例です。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());

    std::transform(vec.begin(), vec.end(), result.begin(), [](int x) { return x * 2; });

    for (int n : result) {
        std::cout << n << " ";
    }
    return 0;
}

このコードでは、ベクターvecの各要素が2倍に変換され、結果はベクターresultに格納されます。結果として2 4 6 8 10が出力されます。

2つの範囲を結合した変換

std::transformは、2つの入力範囲を結合して1つの出力範囲に変換することもできます。例えば、2つのベクターの要素を足し合わせる場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2 = {10, 20, 30, 40, 50};
    std::vector<int> result(vec1.size());

    std::transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), [](int x, int y) { return x + y; });

    for (int n : result) {
        std::cout << n << " ";
    }
    return 0;
}

このコードでは、vec1vec2の各要素が足し合わされ、結果はベクターresultに格納されます。結果として11 22 33 44 55が出力されます。

文字列の変換

std::transformは、文字列の変換にも使用できます。例えば、文字列のすべての文字を大文字に変換する場合は次のようにします。

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

int main() {
    std::string str = "hello world";
    std::string result(str.size(), ' ');

    std::transform(str.begin(), str.end(), result.begin(), ::toupper);

    std::cout << result << std::endl;
    return 0;
}

このコードでは、文字列strの各文字が大文字に変換され、結果は文字列resultに格納されます。結果としてHELLO WORLDが出力されます。

構造体やクラスの変換

std::transformは、構造体やクラスのオブジェクトの変換にも使用できます。例えば、Person構造体の年齢を1歳増やす場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
    std::vector<Person> result(people.size());

    std::transform(people.begin(), people.end(), result.begin(), [](const Person &p) {
        return Person{p.name, p.age + 1};
    });

    for (const auto &person : result) {
        std::cout << person.name << " (" << person.age << ") ";
    }
    return 0;
}

このコードでは、peopleベクターの各要素の年齢が1歳増やされ、結果はベクターresultに格納されます。結果としてAlice (31) Bob (26) Charlie (36)が出力されます。

std::transformを活用することで、様々なデータセットの変換操作を簡単かつ効率的に行うことができます。次はstd::accumulate関数の活用法を見ていきましょう。

std::accumulateの活用法

std::accumulateは、指定された範囲の要素を集計するための関数です。通常、この関数は数値の合計を求めるために使用されますが、他の集計操作にも応用できます。algorithmヘッダに含まれており、シンプルで強力な集計処理を提供します。

基本的な使い方

std::accumulateを使うためには、numericヘッダをインクルードし、集計元の範囲と初期値を指定します。以下のコードは、整数のベクターの要素をすべて合計する基本的な例です。

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    int sum = std::accumulate(vec.begin(), vec.end(), 0);

    std::cout << "Sum: " << sum << std::endl;
    return 0;
}

このコードでは、ベクターvecの各要素が合計され、結果としてSum: 15が出力されます。

カスタム関数を使用した集計

std::accumulateは、デフォルトで加算を行いますが、カスタム関数を指定することで他の集計操作も可能です。例えば、要素の積を求める場合は次のようにします。

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    int product = std::accumulate(vec.begin(), vec.end(), 1, std::multiplies<int>());

    std::cout << "Product: " << product << std::endl;
    return 0;
}

このコードでは、ベクターvecの各要素が掛け合わされ、結果としてProduct: 120が出力されます。

文字列の連結

std::accumulateは、数値以外のデータ型にも適用できます。例えば、文字列のベクターを連結する場合は次のようにします。

#include <iostream>
#include <vector>
#include <numeric>
#include <string>

int main() {
    std::vector<std::string> words = {"Hello", " ", "world", "!"};

    std::string sentence = std::accumulate(words.begin(), words.end(), std::string());

    std::cout << "Sentence: " << sentence << std::endl;
    return 0;
}

このコードでは、ベクターwordsの各要素が連結され、結果としてSentence: Hello world!が出力されます。

構造体やクラスの集計

std::accumulateは、構造体やクラスのオブジェクトの集計にも使用できます。例えば、Person構造体の年齢の合計を求める場合は次のようにします。

#include <iostream>
#include <vector>
#include <numeric>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};

    int totalAge = std::accumulate(people.begin(), people.end(), 0, [](int sum, const Person &p) {
        return sum + p.age;
    });

    std::cout << "Total Age: " << totalAge << std::endl;
    return 0;
}

このコードでは、peopleベクターの各要素の年齢が合計され、結果としてTotal Age: 90が出力されます。

std::accumulateを活用することで、様々なデータセットの集計操作を簡単かつ効率的に行うことができます。次はstd::for_each関数の活用法を見ていきましょう。

std::for_eachの活用法

std::for_eachは、指定された範囲の各要素に対して特定の操作を実行するための関数です。algorithmヘッダに含まれており、コードを簡潔にするための便利なツールです。

基本的な使い方

std::for_eachを使うためには、algorithmヘッダをインクルードし、操作対象の範囲と実行する関数を指定します。以下のコードは、整数のベクターの各要素を出力する基本的な例です。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    std::for_each(vec.begin(), vec.end(), [](int x) {
        std::cout << x << " ";
    });

    std::cout << std::endl;
    return 0;
}

このコードでは、ベクターvecの各要素が順番に出力され、結果として1 2 3 4 5が表示されます。

カスタム操作を実行する

std::for_eachを使用して、各要素に対してカスタム操作を実行することもできます。例えば、各要素を2倍にする場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    std::for_each(vec.begin(), vec.end(), [](int &x) {
        x *= 2;
    });

    for (int n : vec) {
        std::cout << n << " ";
    }

    std::cout << std::endl;
    return 0;
}

このコードでは、ベクターvecの各要素が2倍にされ、結果として2 4 6 8 10が出力されます。

構造体やクラスの操作

std::for_eachは、構造体やクラスのオブジェクトの操作にも使用できます。例えば、Person構造体の年齢を1歳増やす場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};

    std::for_each(people.begin(), people.end(), [](Person &p) {
        p.age += 1;
    });

    for (const auto &person : people) {
        std::cout << person.name << " (" << person.age << ") ";
    }

    std::cout << std::endl;
    return 0;
}

このコードでは、peopleベクターの各要素の年齢が1歳増やされ、結果としてAlice (31) Bob (26) Charlie (36)が出力されます。

エラー処理やログ記録

std::for_eachを使用して、エラー処理やログ記録を簡単に行うことができます。例えば、負の値を検出して警告メッセージを表示する場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, -2, 3, -4, 5};

    std::for_each(vec.begin(), vec.end(), [](int x) {
        if (x < 0) {
            std::cerr << "Warning: Negative value " << x << " detected!" << std::endl;
        }
    });

    return 0;
}

このコードでは、ベクターvecの各要素をチェックし、負の値が見つかった場合に警告メッセージを表示します。結果として、Warning: Negative value -2 detected!およびWarning: Negative value -4 detected!が表示されます。

std::for_eachを活用することで、様々なデータセットに対して反復処理を簡単かつ効率的に行うことができます。次はstd::copy関数の活用法を見ていきましょう。

std::copyの活用法

std::copyは、指定された範囲の要素を別の範囲にコピーするための関数です。algorithmヘッダに含まれており、データの移動や複製を効率的に行うために使用されます。

基本的な使い方

std::copyを使うためには、algorithmヘッダをインクルードし、コピー元の範囲とコピー先の開始位置を指定します。以下のコードは、整数のベクターの要素を別のベクターにコピーする基本的な例です。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2(vec1.size());

    std::copy(vec1.begin(), vec1.end(), vec2.begin());

    for (int n : vec2) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
    return 0;
}

このコードでは、ベクターvec1の各要素がvec2にコピーされ、結果として1 2 3 4 5が出力されます。

条件に基づいたコピー

std::copy_ifを使用すると、条件に基づいて要素をコピーすることができます。例えば、偶数の要素だけをコピーする場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2;

    std::copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), [](int x) {
        return x % 2 == 0;
    });

    for (int n : vec2) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
    return 0;
}

このコードでは、ベクターvec1の偶数の要素だけがvec2にコピーされ、結果として2 4が出力されます。

範囲を逆転してコピー

std::reverse_copyを使用すると、範囲の要素を逆順にコピーすることができます。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2(vec1.size());

    std::reverse_copy(vec1.begin(), vec1.end(), vec2.begin());

    for (int n : vec2) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
    return 0;
}

このコードでは、ベクターvec1の要素が逆順にvec2にコピーされ、結果として5 4 3 2 1が出力されます。

構造体やクラスのオブジェクトのコピー

std::copyは、構造体やクラスのオブジェクトのコピーにも使用できます。例えば、Person構造体のオブジェクトをコピーする場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people1 = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
    std::vector<Person> people2(people1.size());

    std::copy(people1.begin(), people1.end(), people2.begin());

    for (const auto &person : people2) {
        std::cout << person.name << " (" << person.age << ") ";
    }
    std::cout << std::endl;
    return 0;
}

このコードでは、people1の各要素がpeople2にコピーされ、結果としてAlice (30) Bob (25) Charlie (35)が出力されます。

std::copyを活用することで、様々なデータセットのコピー操作を簡単かつ効率的に行うことができます。次は、std::algorithmを使った自作アルゴリズムとの組み合わせについて見ていきましょう。

応用例: 自作アルゴリズムとの組み合わせ

std::algorithmの関数は、自作アルゴリズムと組み合わせることで、より強力かつ柔軟なデータ処理を実現できます。ここでは、std::algorithmを使用して自作アルゴリズムを強化する方法をいくつか紹介します。

カスタムソート関数の活用

std::sortを使って、特定の条件に基づいたソートを実装することができます。例えば、複数の基準でソートを行う場合、カスタムソート関数を定義して使用します。

#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
    double height;
};

bool customSort(const Person &a, const Person &b) {
    if (a.age != b.age) {
        return a.age < b.age;
    }
    return a.height > b.height;
}

int main() {
    std::vector<Person> people = {{"Alice", 30, 165.0}, {"Bob", 25, 180.0}, {"Charlie", 25, 175.0}};

    std::sort(people.begin(), people.end(), customSort);

    for (const auto &person : people) {
        std::cout << person.name << " (Age: " << person.age << ", Height: " << person.height << ") ";
    }
    std::cout << std::endl;
    return 0;
}

このコードでは、Person構造体のオブジェクトが年齢でソートされ、年齢が同じ場合は身長で降順にソートされます。

複合操作の実行

std::transformとstd::accumulateを組み合わせて、複雑なデータ処理を実行することができます。例えば、各要素を変換してから合計を求める場合は次のようにします。

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> transformed(vec.size());

    // 各要素を2倍に変換
    std::transform(vec.begin(), vec.end(), transformed.begin(), [](int x) { return x * 2; });

    // 変換後の要素の合計を求める
    int sum = std::accumulate(transformed.begin(), transformed.end(), 0);

    std::cout << "Transformed sum: " << sum << std::endl;
    return 0;
}

このコードでは、ベクターの各要素が2倍に変換され、その後合計が計算されます。結果としてTransformed sum: 30が出力されます。

複雑なフィルタリングと変換

std::copy_ifとstd::transformを組み合わせて、条件に基づいたフィルタリングと変換を同時に行うことができます。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<int> result;

    std::copy_if(vec.begin(), vec.end(), std::back_inserter(result), [](int x) {
        return x % 2 == 0;
    });

    std::transform(result.begin(), result.end(), result.begin(), [](int x) {
        return x * x;
    });

    for (int n : result) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
    return 0;
}

このコードでは、ベクターvecの偶数の要素だけがresultにコピーされ、その後各要素が平方されます。結果として4 16 36 64 100が出力されます。

std::algorithmを自作アルゴリズムと組み合わせることで、複雑なデータ処理を簡潔かつ効率的に実装することができます。次は、学んだ内容を実践するための演習問題を見ていきましょう。

演習問題

ここでは、std::algorithmヘッダ内の関数を使って理解を深めるための演習問題をいくつか紹介します。各問題に対してコードを書いて実行し、結果を確認してください。

演習問題1: 配列のソートと検索

整数の配列を昇順にソートし、特定の値を検索するプログラムを作成してください。次の配列を使用し、値7を検索してください。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 3, 8, 6, 2, 7, 4, 1};

    // ここにソートと検索のコードを追加
    std::sort(vec.begin(), vec.end());
    auto it = std::find(vec.begin(), vec.end(), 7);

    // ソート後の配列を出力
    std::cout << "Sorted array: ";
    for(int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // 検索結果を出力
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Not Found" << std::endl;
    }
    return 0;
}

期待される出力:

Sorted array: 1 2 3 4 5 6 7 8 
Found: 7

演習問題2: 文字列の変換

文字列のベクターの各要素を大文字に変換するプログラムを作成してください。次のベクターを使用してください。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main() {
    std::vector<std::string> words = {"hello", "world", "example"};

    // ここに変換のコードを追加
    std::transform(words.begin(), words.end(), words.begin(), [](std::string &s) {
        std::transform(s.begin(), s.end(), s.begin(), ::toupper);
        return s;
    });

    // 変換後の文字列を出力
    for(const auto &word : words) {
        std::cout << word << " ";
    }
    std::cout << std::endl;
    return 0;
}

期待される出力:

HELLO WORLD EXAMPLE

演習問題3: 構造体のフィルタリングと変換

Person構造体の年齢が30以上の人をフィルタリングし、名前を大文字に変換するプログラムを作成してください。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
    std::vector<Person> filtered;

    // ここにフィルタリングと変換のコードを追加
    std::copy_if(people.begin(), people.end(), std::back_inserter(filtered), [](const Person &p) {
        return p.age >= 30;
    });

    std::transform(filtered.begin(), filtered.end(), filtered.begin(), [](Person &p) {
        std::transform(p.name.begin(), p.name.end(), p.name.begin(), ::toupper);
        return p;
    });

    // 結果を出力
    for(const auto &person : filtered) {
        std::cout << person.name << " (" << person.age << ") ";
    }
    std::cout << std::endl;
    return 0;
}

期待される出力:

ALICE (30) CHARLIE (35)

これらの演習問題を通じて、std::algorithmヘッダ内の関数の理解を深め、実際のプログラムでの応用力を高めてください。次はこの記事のまとめです。

まとめ

std::algorithmヘッダは、C++標準ライブラリの中でも非常に重要で便利な機能を提供します。この記事では、std::algorithmヘッダ内の代表的な関数であるstd::sortstd::findstd::transformstd::accumulatestd::for_eachstd::copyの使い方を紹介しました。これらの関数を適切に活用することで、プログラムの効率性と可読性が大幅に向上します。さらに、自作アルゴリズムと組み合わせることで、より強力で柔軟なデータ処理が可能になります。

これからも積極的にstd::algorithmを活用し、C++プログラミングのスキルを向上させてください。この記事が、その一助となれば幸いです。

コメント

コメントする

目次