何人かの人々が、コードを機能させる方法を指摘しています。将来的に問題を回避する方法を指摘します: コードを書かないでください (自分で):
std::vector<int> x(5);
std::iota(x.begin(), x.end(), 1);
std::reverse(x.begin(), x.end());
std::copy(x.begin(), x.end(),
std::ostream_iterator<int>(std::cout, "\n"));
このようにコピーする直前に反転することは十分に一般的であるため、標準には2つを組み合わせるアルゴリズムがあります。
std::vector<int> x(5);
std::iota(x.begin(), x.end(), 1);
std::reverse_copy(x.begin(), x.end(),
std::ostream_iterator<int>(std::cout, "\n"));
状況によっては、reverse_copy の代わりにリバース イテレータを使用する方が簡単な場合があります。
std::vector<int> x(5);
std::iota(x.begin(), x.end(), 1);
std::copy(x.rbegin(), x.rend(), std::ostream_iterator<int>(std::cout, "\n"));
ただし、後者の 2 つのケースでは、実行していることは微妙に異なることに注意してください。ベクター内のデータを逆にしてから、ベクターを最初から最後まで出力しているわけではありません。むしろ、ベクトルを逆の順序で出力しているだけで、ほぼ次のようになります。
for (int i=x.size(); i>0; i--)
std::cout << x[i-1] << "\n";
最後の詳細: を使用しないことをお勧めしstd::endl
ます。多くの書籍 (および教師、講師、教授など) が "\n" の代わりに使用していることは知っていますが、実際にはそうではありません。改行を書き込むだけでなく、ストリームをフラッシュします。あなたはそれを望んでいません。まれにそうする場合は、std::flush
代わりに を使用して、本当にそれが必要であることを明確にする必要があります。改行が必要な場合は、改行を書くだけです。