C++ STLのmap::crbegin()とmap::crend()関数の使い方を徹底解説
この記事では、C++ STLにおけるmap::crbegin()関数とmap::crend()関数の動作、構文、具体的な使用例について詳しく解説します。
C++ STLにおけるマップ(map)とは?
マップ(map)は連想コンテナの一種で、キー値とマップされた値の組み合わせで構成される要素を、特定の順序で格納することができます。マップコンテナ内のデータは、内部的に常にキーに基づいてソートされており、コンテナ内の値には一意のキーを使ってアクセスします。
map::crbegin()とは?
map::crbegin()関数は、C++ STLに組み込まれている関数で、<map>ヘッダーファイルで定義されています。crbegin()は「constant reverse begin(定数逆順の先頭)」を意味し、定数イテレータであるcbegin()の逆順バージョンに相当します。つまり、この関数は、関連付けられたマップコンテナの最後の要素を指すイテレータを返します。
このイテレータは定数(const)であるため、マップの要素を変更する目的には使用できず、マップコンテナを逆順に走査する目的でのみ使用できます。
構文
Map_name.crbegin();
パラメータ
この関数は、いかなるパラメータも受け取りません。
戻り値
マップコンテナの最後の要素を指す定数逆順イテレータを返します。
使用例
入力
map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
newmap.crbegin();
出力
c:3
この例では、マップの最後の要素(キー「c」、値「3」)を指すイテレータが返されます。
map::crbegin()の実装例
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.insert({3, 50});
TP_Map.insert({2, 30});
TP_Map.insert({1, 10});
TP_Map.insert({4, 70});
// map::crbeginを使って最後の要素を取得
auto temp = TP_Map.crbegin();
cout<<"First element is: "<<temp->first << " -> " << temp->second;
cout<<"\nTP Map is : \n";
cout << "MAP_KEY\tMAP_ELEMENT\n";
for (auto i = TP_Map.crbegin(); i!= TP_Map.crend(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
出力
First element is: 4 -> 70
TP Map is:
MAP_KEY MAP_ELEMENT
4 70
3 50
2 30
1 10
このコードでは、crbegin()を使うことで、マップの最後の要素(キー4、値70)を取得し、さらにcrbegin()からcrend()までループを回すことで、マップ全体をキーの降順(逆順)で走査・出力しています。
map::crend()とは?
map::crend()関数は、C++ STLに組み込まれている関数で、<map>ヘッダーファイルで定義されています。crend()は「constant reverse end(定数逆順の終端)」を意味し、定数イテレータであるcend()の逆順バージョンに相当します。つまり、この関数は、関連付けられたマップコンテナの先頭要素の直前の位置を指すイテレータを返します。
このイテレータも定数(const)であるため、マップの要素を変更することはできず、マップコンテナを逆順に走査する際の終端条件として使用します。
構文
newmap.crend();
パラメータ
この関数は、いかなるパラメータも受け取りません。
戻り値
関連付けられたマップコンテナの先頭要素の直前の位置を指す定数逆順イテレータを返します。
使用例
入力
map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
newmap.crend();
出力
error
crend()が指す位置は先頭要素の直前であり、実際の要素が存在しない位置であるため、このイテレータをデリファレンス(参照外し)しようとするとエラーになります。crend()はあくまで逆順走査の終端判定に使うものです。
map::crend()の実装例
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.insert({3, 50});
TP_Map.insert({2, 30});
TP_Map.insert({1, 10});
TP_Map.insert({4, 70});
cout<<"\nTP Map is : \n";
cout << "MAP_KEY\tMAP_ELEMENT\n";
for (auto i = TP_Map.crbegin(); i!= TP_Map.crend(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
出力
TP Map is:
MAP_KEY MAP_ELEMENT
4 70
3 50
2 30
1 10
このように、crbegin()とcrend()を組み合わせることで、マップの要素をキーの降順に安全かつ効率的に走査することができます。要素の変更が不要な読み取り専用の処理では、定数イテレータを使うことでコードの意図が明確になり、誤ってコンテナを変更してしまうバグを防ぐことにもつながります。
-
C++ STLのarray::crbegin()とarray::crend()の使い方を解説
この記事では、C++ STLのstd::arrayが提供するcrbegin()とcrend()という2つのメンバ関数について詳しく解説します。これらの関数を使うと、配列の要素を逆順に安全に走査することができます。 array::crbegin() とは array::crbegin()は、コンテナの逆順イテレータ(リバースイテレータ)を取得するための関数です。戻り値は定数(const)の逆順イテレータであり、コンテナの最後の要素を指します。 「c」が接頭辞についていることからわかるように、このイテレータは読み取り専用です。つまり、イテレータを通じて要素の値を変更しようとするとコンパイルエラーに
-
C++ STLのmap・multimapを降順で扱う方法
一般に、C++のmapおよびmultimapは、デフォルトではキーを昇順で格納します。しかし、第3テンプレート引数として比較用の関数オブジェクトstd::greaterを指定することで、要素を降順で格納することも簡単にできます。 mapを降順で使用する 使用する主なメンバ関数 m.find() – 指定したキーを持つ要素へのイテレータを返します。見つからない場合はend()イテレータを返します。 m.erase() – マップから指定したキーの要素を削除します。 m.equal_range() – イテレータのペア(pair)を返します。このペアは、指定したキーと等しいキーを持つすべての要素