C++では、配列のほか、std::vectorやstd::listのような列コンテナの並びを逆にするための標準関数が用意されています。<algorithm>で宣言・定義されているstd::reverse関数とstd::reverse_copy関数がそれにあたります。
std::reverseはもとの列を逆順に並べ替えます。std::reverse_copyはもとの列はそのままにして、逆順に並べ替えた結果を別のところに出力します。どちらの関数ももとの列の範囲を表す反復子はBidirectionalIterator、すなわち++や–で前にも後ろにも進める反復子でなければなりません。std::istream_iteratorやstd::istreambuf_iteratorのようなBidirectionalIteratorでない反復子は使えません。
これだけで終わってしまうのも何なので、簡単な例を紹介しておきます。
まずはstd::reverse関数からです。
0 1 2 3 4 |
std::string s("abc"); std::reverse(s.begin(), s.end()); std::cout << s << std::endl; |
この例では、文字列sを逆順にして結果を出力しています。
次はstd::reverse_copyです。
0 1 2 3 4 5 6 7 8 9 10 |
int a[] = { 1, 2, 3 }; std::vector<int> v; std::reverse_copy(a + 0, a + 3, std::back_inserter(v)); std::copy(a + 0, a + 3, std::ostream_iterator<int>(std::cout, ", ")); std::cout << std::endl; std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ", ")); std::cout << std::endl; |
ちょっと長くなりましたが、前半で配列aの内容を逆順にしてvに格納しています。後半では、aとvの内容を標準出力に書き出しています。もちろん、vにいったん格納するのではなく、逆順にした結果を直接標準出力にしてもかまいません。