先頭へ戻る

STLアルゴリズム 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第18章

Programming Place Plus トップページC++編

先頭へ戻る

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① for_each関数がどのように実装されているか、想像して自力の実装を書いてみてください。


次のようになります。

template <typename InputIterator, typename Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
    for ( ;first != last; ++first) {
        f(*first);
    }
    return f;
}

STLアルゴリズムは使い方だけを調べていると、なかなか理解しづらい面があると思います。どのように実装されているのかを調べてみると、案外単純であることが分かるのではないでしょうか。

問題②

問題② for_each関数を使って、各要素の平均値を計算する処理を作成してください。


関数オブジェクトを使えば、要素の値の合計と、要素数をカウントして、メンバ変数に取っておけます。

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

class Average {
public:
    Average() : mSum(0), mCount(0)
    {}

    void operator()(int elem)
    {
        mSum += elem;
        ++mCount;
    }

    operator int() const
    {
        return mSum / mCount;
    }

private:
    int  mSum;
    int  mCount;
};

int main()
{
    std::vector<int> v;
    v.push_back(9);
    v.push_back(16);
    v.push_back(14);

    const int average = std::for_each(v.begin(), v.end(), Average());
    std::cout << "average: " << average << std::endl;
}

実行結果

average: 13

問題③

問題③ for_each関数や equal関数は、通常の配列に対しても使用できるでしょうか? 予想を立てた後、実際にプログラムを書いて確かめてください。


STLアルゴリズムは、要素をイテレータを介してアクセスしており、対象のコンテナが何であるかは関知していません。イテレータが配列に対しても機能する以上、STLアルゴリズムを配列に対して使うことも可能です。

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

class Average {
public:
    Average() : mSum(0), mCount(0)
    {}

    void operator()(int elem)
    {
        mSum += elem;
        ++mCount;
    }

    operator int() const
    {
        return mSum / mCount;
    }

private:
    int  mSum;
    int  mCount;
};

int main()
{
    const int a[] = { 9, 16, 14 };
    const int b[] = { 9, 16, 14 };

    const int average = std::for_each(a, a + 3, Average());
    std::cout << "average: " << average << std::endl;

    std::cout << std::boolalpha
              << std::equal(a, a + 3, b)
              << std::endl;
}

実行結果

average: 13
true


参考リンク


更新履歴

’2016/11/19 新規作成。



第18章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー