C++ STLのarray::crbegin()とarray::crend()の使い方を解説
この記事では、C++ STLのstd::arrayが提供するcrbegin()とcrend()という2つのメンバ関数について詳しく解説します。これらの関数を使うと、配列の要素を逆順に安全に走査することができます。
array::crbegin() とは
array::crbegin()は、コンテナの逆順イテレータ(リバースイテレータ)を取得するための関数です。戻り値は定数(const)の逆順イテレータであり、コンテナの最後の要素を指します。
「c」が接頭辞についていることからわかるように、このイテレータは読み取り専用です。つまり、イテレータを通じて要素の値を変更しようとするとコンパイルエラーになります。データを変更せずに逆順に読み取りたい場合に最適です。
なお、この関数は引数を一切取りません。
array::crend() とは
array::crend()は、crbegin()の対となる関数で、逆順シーケンスの終端を示します。正確には、逆順に並べたシーケンスにおける「最後の要素の次(つまり元の配列の先頭より前の理論上の位置)」を指す定数逆順イテレータを返します。
通常のイテレータと同じように、crend()が返すイテレータは終端判定のために使用され、それ自体が指す先を参照(デリファレンス)してはいけません。
サンプルコード
それでは、実際のコード例を見てみましょう。以下の例では、crbegin()からcrend()までループを回すことで、配列の要素を逆順に出力しています。
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 10> arr = {0, 11, 22, 33, 44, 55, 66, 77, 88, 99};
cout << "逆順のリスト: ";
for (auto it = arr.crbegin(); it != arr.crend(); it++) {
cout << *it << " ";
}
return 0;
}
実行結果
逆順のリスト: 99 88 77 66 55 44 33 22 11 0
まとめ
crbegin()とcrend()を組み合わせることで、配列の要素を末尾から先頭へ逆順に走査できます。通常のrbegin()/rend()との違いは、要素の変更ができない点です。読み取り専用で逆順アクセスが必要な場面では、これらの関数を使うことで意図しないデータの書き換えを防ぎ、より安全なコードを書くことができます。
-
C++ STLのlist::reverse()関数の使い方と実例解説
本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar
-
C++でSTLを使用して配列のすべての逆順列を生成する方法
この記事では、C++のSTL(Standard Template Library)を使用して、配列のすべての逆順列を生成する方法を解説します。たとえば、(1, 2, 3) という数値列の順方向の順列と逆順列は、それぞれ以下のようになります。順方向の順列1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1逆順列3, 2, 1 3, 1, 2 2, 3, 1 2, 1, 3 1, 3, 2 1, 2, 3逆順列を求めるには、STLの prev_permutation() 関数を使用します。この関数は、現在の並びを辞書式順序で1つ前の順列に変換し、前の順列が