ニコの答えはあなたにとってより良い道かもしれませんが、より慣用的なアプローチを好む人には、一度保存すると簡単に逆方向に印刷できる行のベクトルをお勧めします. 最初のことはLine
、スペースで停止する代わりに入力行を慣用的に読み取るために使用できるクラスです。
struct Line {
std::string str;
};
std::istream &operator>>(std::istream &in, Line &line) {
std::getline(in, line.str);
if (line.str == "stop") {
in.clear(std::ios::failbit);
}
return in;
}
std::ostream &operator<<(std::ostream &out, const Line &line) {
out << line.str;
return out;
}
必要なLine
のは実際のテキストを含む文字列だけです。次に説明する理由から、入力と出力のサポートを追加しました。入力がgetline
ではなくスルーであることに注意してください>>
。Line
これがクラスの主な目的です。また、「stop」を入力すると失敗するようにしました。それが省略されている場合は、EOF まで読み取りを続けます。
これで、必要に応じて入力を整形するために、最小限の労力で line クラスを再利用できます。次に、作成したばかりのもの (または他のものから残したもの) を使用します。
int main() {
std::istream_iterator<Line> in1(std::cin), in2;
std::vector<Line> inputs(in1, in2);
std::reverse_copy(std::begin(inputs), std::end(inputs), std::ostream_iterator<Line>(std::cout, "\n"));
}
最初に行うことは、入力を読み取ってベクトルを形成することです ( の入力サポートを使用Line
)。ファイルの終わりに到達するか、「停止」が入力されると、停止し、すべての行入力がベクトルに適切に格納されます。
次に、reverse_copy
ベクトル内のすべて (入力の各行) を改行で区切って標準出力にコピーするように呼び出しますが、すべて逆方向に実行されるため、すべての行が逆の順序になります。
以上です!クラスが作成されると、Line
ライン入力を取得してそれらを逆にするアルゴリズムは、単語で行っている場合と同じままでかまいませんが、ラインへの切り替えには、 のいくつかのインスタンスを に置き換えるだけで済みstd::string
ますLine
。