【C++ STL】set::crbegin()とset::crend()関数の使い方を徹底解説
本記事では、C++ STLにおけるset::crbegin()およびset::crend()関数について、その構文、動作、戻り値をサンプルコード付きで詳しく解説します。
C++ STLにおけるsetとは?
C++ STLのsetは、重複しない一意な要素を保持する連想コンテナです。set内の各要素はその値そのものによって識別されるため、同じ値を複数格納することはできません。
一度setコンテナに追加された要素の値は後から変更できませんが、要素の削除や新規追加は可能です。setは内部的に二分探索木(一般的には赤黒木)として実装されており、要素は常にソートされた状態で保持されます。
set::crbegin()とは?
crbegin()はC++ STLに組み込まれた関数で、<set>ヘッダーファイルで定義されています。「crbegin」はconstant reverse begin(定数逆順先頭)の略で、定数イテレータcbegin()の逆順版に相当します。
この関数は、関連付けられたsetコンテナの最後の要素を指すconst_reverse_iteratorを返します。返されるイテレータは定数であるため、setの要素を変更することはできず、コンテナの走査(読み取り専用アクセス)にのみ使用できます。
構文
constant_iterator name_of_set.crbegin();
パラメータ
この関数はパラメータを受け取りません。
戻り値
setコンテナの最後の要素を指す定数逆順イテレータを返します。
使用例
入力: set<int> myset = {1, 2, 3, 4, 5};
myset.crbegin();
出力: 5
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int arr[] = {1, 2, 3, 4, 5};
set<int> ch(arr, arr + 5);
for (auto i = ch.crbegin(); i != ch.crend(); i++)
cout << *i << " ";
return 0;
}
出力結果
上記のコードを実行すると、以下の出力が得られます。
5 4 3 2 1
このように、crbegin()からcrend()までループを回すことで、setの要素を降順(大きい順)に出力できます。
set::crend()とは?
crend()もC++ STLに組み込まれた関数で、<set>ヘッダーファイルで定義されています。「crend」はconstant reverse end(定数逆順終端)の略で、定数イテレータcend()の逆順版に相当します。
この関数は、setコンテナの最初の要素の直前の位置を指すconst_reverse_iteratorを返します。この位置は実際の要素が存在しない理論上の終端マーカーであり、逆順走査の終了条件として機能します。返されるイテレータは定数のため、要素の変更はできず、走査専用として使用されます。
構文
constant_iterator name_of_set.crend();
パラメータ
この関数はパラメータを受け取りません。
戻り値
setコンテナの最初の要素の直前の位置を指す定数逆順イテレータを返します。
使用例
入力: set<int> myset = {1, 2, 3, 4, 5};
myset.crend();
出力: 最初の要素(1)の直前の理論上の位置を示すイテレータ
※ 実際の要素を指さないため、逆順走査の終端判定に使われます。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int arr[] = {3, 5, 8, 1, 9};
set<int> ch(arr, arr + 5);
for(auto i = ch.crbegin(); i != ch.crend(); i++)
cout << *i << " ";
return 0;
}
出力結果
上記のコードを実行すると、以下の出力が得られます。
9 8 5 3 1
配列{3, 5, 8, 1, 9}から生成されたsetは自動的にソートされ{1, 3, 5, 8, 9}となるため、crbegin()からcrend()まで逆順に走査すると降順の「9 8 5 3 1」が出力されます。
まとめ
crbegin()とcrend()は、setコンテナを読み取り専用で逆順に走査するためのイテレータペアです。要素の変更が不要な場面で安全性を確保しながら降順アクセスを行いたい場合に活用するとよいでしょう。
-
C++ STLのset find()関数の使い方を解説
C++ STLのsetコンテナにおけるfind()関数は、指定した要素を検索し、その要素を指すイテレータを返します。もし要素がセット内に存在しない場合は、最後の要素の直後の位置(つまりend()が返すイテレータ)を指す値が返されます。この関数の計算量はO(log n)であり、setが内部的に平衡二分探索木(赤黒木)で実装されているため、高速な検索が可能です。アルゴリズムBegin セットコンテナの要素を出力するための関数 printS() を定義する。 空のセットコンテナ s を初期化し、いくつかの要素を挿入する。 関数を呼び出して、セットコンテナの要素を出力する。
-
C++のSTL set(セット)における要素の挿入と削除の基本
C++のSTL(標準テンプレートライブラリ)に含まれる set コンテナは、重複しない要素を自動的にソートして管理する便利なデータ構造です。本記事では、setへの挿入と削除の方法を、実際に動作するサンプルコードと出力例とともに詳しく解説します。 要素の挿入:insert() STLのsetに要素を挿入するには、insert() 関数を使用します。insert() はオブジェクトへの参照を受け取り、その要素を適切な位置(自動的にソートされた状態を保つ位置)に追加します。 すでに同じ値がセット内に存在する場合、重複した挿入は行われず、セットの内容は変化しません。これがsetコンテナの大きな特徴です