C++
 Computer >> コンピューター >  >> プログラミング >> C++

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以降が使用可能な場合は、標準機能の利用を検討するとよいでしょう。

  1. C++ STLのlist::reverse()関数の使い方と実例解説

    本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar

  2. C#で文字列を反転する方法(Array.Reverseの使い方)

    C#で文字列を反転する方法 C#で文字列を逆順に並べ替えたい場合は、Array.Reverse()メソッドを使うのが最も簡単です。文字列はそのままでは直接反転できないため、一度文字配列(char配列)に変換してから反転処理を行います。 文字列を反転するサンプルコード 以下は、文字列を反転して返すカスタムメソッドの例です。ここでは、引数として渡された文字列「Henry」を反転させています。 public static string ReverseFunc(string str) { char[] ch = str.ToCharArray(); Array.Reverse(ch)