ストリームイテレータ 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第31章

トップページ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++編を作成中です。

問題①

問題① 標準入力から、空白で区切られた複数の文字列を受け取り、入力された順番と逆順になるように標準出力へ書き込むプログラムを、istream_iterator、ostream_iterator を使って作成してください。


たとえば、次のようになります。

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

int main()
{
    std::vector<std::string> words;

    std::istream_iterator<std::string> isIt(std::cin);
    std::istream_iterator<std::string> isItEnd;
    std::copy(isIt, isItEnd, std::back_inserter(words));

    std::ostream_iterator<std::string> osIt(std::cout, " ");
    std::reverse_copy(words.begin(), words.end(), osIt);
    std::cout << std::endl;
}

実行結果:

xxx yyy zzz   <-- 標準入力
zzz yyy xxx

標準入力からの入力を終了させるには、Windows なら Ctrl+Z を、macOS なら Ctrl+D を入力します。

ここでは vector を使っていますが、受け取りに使うデータ構造は何でも構いません。ただ、入力される量は不明なので、自動的に拡張される STLコンテナを使うのが簡単です。挿入イテレータも活用してください。

順序を逆転させて出力するには、コピー先を、標準出力に結びつけた ostream_iterator を使い、reverse_copy関数(第22章)に任せるのが簡単です。

問題②

問題② 問題①のようなプログラムを、ストリームバッファイテレータを使って作成することは適切と言えるでしょうか?


ストリームバッファイテレータを使うと、問題①の実行結果の例のように、「xxx yyy zzz」と入力した場合、“xxx yyy zzz” という1つの文字列になるので、単語を逆の順序で出力するためには、空白を探して、1つ1つの単語に分割するような処理を別途作成しなければなりません。これでは余計な手間を増やすばかりです。

ストリームバッファイテレータは、1文字単位で入出力を行い、1文字単位で処理を行う場合には有効ですが、問題①のように、空白区切りの複数の文字列や、行単位で文字列を扱うような場合には向いていません。


参考リンク


更新履歴

’2017/2/11 新規作成。



第31章のメインページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る