C++11で逆順の範囲ベースforループを実現する方法
C++11で導入された範囲ベースforループ(range-based for loop)は、コンテナや配列の全要素を簡潔に走査できる便利な構文です。しかし、標準の範囲ベースforループは前方向の走査のみをサポートしており、要素を逆順に処理したい場合にはそのまま使うことができません。
この課題を解決してくれるのが、C++開発者の間で非常に人気の高いライブラリ「Boost」です。Boostには強力な機能が多数含まれており、その中の boost::adaptors::reverse() を利用することで、配列やSTLコンテナを逆順に走査する範囲ベースforループを簡単に実現できます。
コード例
以下の例では、std::list の要素を通常の順序と逆順の両方で出力しています。
#include <list>
#include <iostream>
#include <boost/range/adaptor/reversed.hpp>
using namespace std;
int main() {
std::list<int> x {11, 44, 77, 55, 44, 22, 33, 30, 88, 99, 55, 44};
cout << "Normal Loop" << endl;
for (auto i : x)
std::cout << i << '\n';
cout << "Reversed Loop" << endl;
for (auto i : boost::adaptors::reverse(x))
std::cout << i << '\n';
}実行結果
Normal Loop 11 44 77 55 44 22 33 30 88 99 55 44 Reversed Loop 44 55 99 88 30 33 22 44 55 77 44 11
コードのポイント
#include <boost/range/adaptor/reversed.hpp>をインクルードすることで、逆順アダプタが使えるようになります。boost::adaptors::reverse(x)は元のコンテナxを変更せず、逆順に見せる新しい範囲(view)を返します。- 範囲ベースforループの構文はそのまま使えるため、通常のループと同じ書き方で逆順走査が実現できます。
補足: C++20以降の場合
C++20では標準ライブラリにRangesライブラリが導入されたため、Boostに依存せず std::views::reverse(x) を使って同様の逆順ループを記述できます。新しいプロジェクトでC++20以降が使用可能な場合は、標準機能の利用を検討するとよいでしょう。
-
C++ STLのlist::reverse()関数の使い方と実例解説
本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar
-
C#で文字列を反転する方法(Array.Reverseの使い方)
C#で文字列を反転する方法 C#で文字列を逆順に並べ替えたい場合は、Array.Reverse()メソッドを使うのが最も簡単です。文字列はそのままでは直接反転できないため、一度文字配列(char配列)に変換してから反転処理を行います。 文字列を反転するサンプルコード 以下は、文字列を反転して返すカスタムメソッドの例です。ここでは、引数として渡された文字列「Henry」を反転させています。 public static string ReverseFunc(string str) { char[] ch = str.ToCharArray(); Array.Reverse(ch)