C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① for_each関数がどのように実装されているか、想像して自力の実装を書いてみてください。
次のようになります。
template <typename InputIterator, typename Function>
(InputIterator first, InputIterator last, Function f)
Function for_each{
for ( ;first != last; ++first) {
(*first);
f}
return f;
}
STLアルゴリズムは使い方だけを調べていると、なかなか理解しづらい面があると思います。どのように実装されているのかを調べてみると、案外単純であることが分かるのではないでしょうか。
問題② for_each関数を使って、各要素の平均値を計算する処理を作成してください。
関数オブジェクトを使えば、要素の値の合計と、要素数をカウントして、メンバ変数に取っておけます。
#include <algorithm>
#include <iostream>
#include <vector>
class Average {
public:
() : mSum(0), mCount(0)
Average{}
void operator()(int elem)
{
+= elem;
mSum ++mCount;
}
operator int() const
{
return mSum / mCount;
}
private:
int mSum;
int mCount;
};
int main()
{
std::vector<int> v;
.push_back(9);
v.push_back(16);
v.push_back(14);
v
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:
() : mSum(0), mCount(0)
Average{}
void operator()(int elem)
{
+= elem;
mSum ++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
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |