先頭へ戻る

STL の関数オブジェクト 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第25章

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++編を作成中です。

問題①

問題① 引数が偶数かどうか判定する以下のような IsEven関数があるとして、これを使って、奇数の要素だけを remove_if関数を使って取り除く処理を作成してください。

namespace {
    bool IsEven(int elem)
    {
        return elem % 2 == 0;
    }
}


std::not1 を使って成否を反転させれば良いですが、IsEven は通常の関数なので(必要な typedef がないため)std::not1 に適合しません。間に std::ptr_fun を挟んでやることで解決できます。

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

namespace {
    bool IsEven(int elem)
    {
        return elem % 2 == 0;
    }
    void Println(int elem)
    {
        std::cout << elem << std::endl;
    }
}

int main()
{
    std::vector<int> v;
    v.push_back(0);
    v.push_back(1);
    v.push_back(2);
    v.push_back(1);
    v.push_back(3);

    std::vector<int>::iterator it = std::remove_if(v.begin(), v.end(), std::not1(std::ptr_fun(IsEven)));

    std::for_each(v.begin(), it, Println);
}

実行結果

0
2


参考リンク


更新履歴

’2016/12/7 新規作成。



第25章のメインページへ

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

Programming Place Plus のトップページへ



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