先頭へ戻る

逆イテレータと挿入イテレータ 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第26章

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

問題①

問題① 逆イテレータを使って、通常と逆順のソートが行えることを確認してください。


たとえば、std::sort関数(第22章)に指定する範囲を逆イテレータで指定すれば、通常の逆の順序になるようにソートできます。

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

namespace {
    void Println(int elem)
    {
        std::cout << elem << std::endl;
    }
}

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

    std::sort(v.rbegin(), v.rend());
    std::for_each(v.begin(), v.end(), Println);
}

実行結果

4
3
2
1
0

問題②

問題② std::string に対して末尾挿入イテレータを使って、文字を末尾へコピーするプログラムを作成してください。


std::string は push_backメンバ関数を持っているので、末尾挿入イテレータを使用できます。

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s = "abcde";
    std::string s2;

    std::copy(s.begin(), s.end(), std::back_inserter(s2));

    std::cout << s2 << std::endl;
}

実行結果

abcde

もちろん、これだけであれば、「s2 = s;」のような代入処理で十分ですが、挿入イテレータを使えると、STLアルゴリズムを活用できる利点が生まれます。その例が問題③です。

問題③

問題③ 問題②を改造して、文字を大文字に変換しながらコピーするようにしてください。


transform関数(第20章)を使い、各文字を std::toupper関数で大文字化すれば実現できます。

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

int main()
{
    std::string s = "abcde";
    std::string s2;

    std::transform(s.begin(), s.end(), std::back_inserter(s2), std::toupper);

    std::cout << s2 << std::endl;
}

実行結果

ABCDE


参考リンク


更新履歴

’2016/12/10 新規作成。



第26章のメインページへ

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

Programming Place Plus のトップページへ



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