【C++ STL】multimap::crbegin()とmultimap::crend()の使い方を解説
この記事では、C++ STLにおけるmultimap::crbegin()およびmultimap::crend()関数の動作、構文、具体的な使用例について詳しく解説します。
C++ STLにおけるmultimapとは?
multimapは、mapコンテナによく似た連想コンテナの一種です。キー(key)とマップされる値(mapped value)のペアで構成される要素を、特定の順序で格納することができます。multimapの最大の特徴は、同じキーに対して複数の要素を関連付けられるという点です。また、コンテナ内のデータは、キーに基づいて常に自動的にソートされて管理されます。
multimap::crbegin()とは?
multimap::crbegin()は、C++ STLに組み込まれている関数で、<map>ヘッダーファイル内で定義されています。crbegin()は「constant reverse begin(読み取り専用の逆順先頭)」を意味し、定数イテレータcbegin()の逆順版に相当します。つまり、この関数は対象のmultimapコンテナの最後の要素を指す逆順イテレータを返します。
返されるイテレータはconst修飾されているため、multimapの要素を変更する目的では使用できません。あくまでコンテナを読み取り専用で走査するために利用します。
構文
multiMap_name.crbegin();
パラメータ
この関数は引数を受け取りません。
戻り値
コンテナの最後の要素を指すconst逆順イテレータ(const_reverse_iterator)を返します。
入力例:
multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
newmap.crbegin();
出力:
c:3
使用例
#include <bits/stdc++.h>
using namespace std;
int main(){
// コンテナを作成
multimap<int, int> mul;
// emplace_hintを使って要素を挿入
mul.emplace_hint(mul.begin(), 1, 10);
mul.emplace_hint(mul.begin(), 2, 20);
mul.emplace_hint(mul.begin(), 2, 30);
mul.emplace_hint(mul.begin(), 1, 40);
mul.emplace_hint(mul.begin(), 1, 50);
mul.emplace_hint(mul.begin(), 5, 60);
auto it = mul.crbegin();
cout << "Last element using crbegin() is: {" << it->first << ", " << it->second << "}\n";
cout << "\nElements in multimap is : \n";
cout << "KEY\tELEMENT\n";
for (auto i = mul.crbegin(); i != mul.crend(); i++){
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます。
Last element using crbegin() is: {5, 60}
Elements in multimap is :
KEY ELEMENT
5 60
2 20
2 30
1 10
1 40
1 50
multimap::crend()とは?
multimap::crend()も、C++ STLに組み込まれている関数で、<map>ヘッダーファイル内で定義されています。crend()は「constant reverse end(読み取り専用の逆順終端)」を意味し、定数イテレータcend()の逆順版に相当します。この関数は、対象のコンテナの先頭要素の直前の位置を指す逆順イテレータを返します。
crend()が返すイテレータは逆走査の終端を表すため、参照外し(デリファレンス)するとエラーや未定義動作になります。そのため、主にcrbegin()と組み合わせて、multimapを後ろから前へ走査する際のループ終了条件として使用されます。このイテレータでもmultimapの要素を変更することはできません。
構文
newmultimap.crend();
パラメータ
この関数は引数を受け取りません。
戻り値
コンテナの先頭要素の直前の位置を指すconst逆順イテレータ(const_reverse_iterator)を返します。
入力例:
multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
newmap.crend();
出力:
error
crend()が返すイテレータは有効な要素を指していないため、直接参照しようとするとエラーになります。
使用例
#include <bits/stdc++.h>
using namespace std;
int main(){
// コンテナを作成
multimap<int, int> mul;
// emplace_hintを使って要素を挿入
mul.emplace_hint(mul.begin(), 1, 10);
mul.emplace_hint(mul.begin(), 2, 20);
mul.emplace_hint(mul.begin(), 2, 30);
mul.emplace_hint(mul.begin(), 1, 40);
mul.emplace_hint(mul.begin(), 1, 50);
mul.emplace_hint(mul.begin(), 5, 60);
cout << "\nElements in multimap is : \n";
cout << "KEY\tELEMENT\n";
for (auto i = mul.crbegin(); i != mul.crend(); i++){
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます。
Elements in multimap is : KEY ELEMENT 5 60 2 20 2 30 1 10 1 40 1 50
-
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)を返します。このペアは、指定したキーと等しいキーを持つすべての要素