C++ STLのmapでequal_range()を使う方法を解説
この記事では、C++ STLのmapコンテナが提供するequal_range()関数について、具体的なコード例を交えながらわかりやすく解説します。
equal_range()とは
equal_range()は、指定したキーと等しいキーを持つ要素の範囲(レンジ)を表す、イテレータのペア(pair)を返すメンバ関数です。返されるペアのうち、firstには下限(lower bound)に相当するイテレータ、secondには上限(upper bound)に相当するイテレータが格納されます。
つまり、この関数を使えば、コンテナ内で「指定したキーに一致する要素が存在する範囲」を一度の呼び出しで取得できるのです。lower_bound()とupper_bound()を個別に呼び出す手間を省けるため、コードを簡潔に書くことができます。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
int main() {
// コンテナの初期化
map<int, int> mp;
mp.insert({ 4, 30 });
mp.insert({ 1, 40 });
mp.insert({ 6, 60 });
// イテレータのペアを宣言
pair<map<int, int>::iterator,
map<int, int>::iterator> it;
// キー「1」に対する範囲を取得
it = mp.equal_range(1);
cout << "下限(lower bound): " << it.first->first << ":" << it.first->second;
cout << "\n上限(upper bound): " << it.second->first << ":" << it.second->second;
return 0;
}実行結果
下限(lower bound): 1:40 上限(upper bound): 4:30
コードのポイント
- キーの検索:
mp.equal_range(1)を呼び出すことで、キー「1」に関連する範囲を取得しています。 - 戻り値の扱い: 戻り値は
pair型であり、it.firstが下限側のイテレータ、it.secondが上限側のイテレータを指します。 - 要素へのアクセス: 各イテレータは
->first(キー)と->second(値)でマップの要素にアクセスできます。
この例では、キー「1」に対応する要素は{1, 40}のみであるため、下限はその要素自身を指し、上限は次のキーである「4」の要素{4, 30}を指します。なお、C++11以降ではautoを使ってauto it = mp.equal_range(1);のように記述すれば、イテレータ型を明示的に宣言する必要がなくなり、さらにコードが読みやすくなります。
-
C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説
セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:
-
STLのマップ(map)を実装するC++プログラムの書き方
マップ(map)とはマップは、要素をキーと値のペアとして対応付けて格納する連想コンテナです。各要素はキー値とマップ値を持ち、同じキー値を持つ要素が複数存在することはありません。使用する主なメンバ関数m::find() – マップ内に指定したキー値(b)を持つ要素が見つかれば、その要素へのイテレータを返します。見つからない場合はend()へのイテレータを返します。m::erase() – マップから指定したキー値の要素を削除します。m::equal_range() – ペア(pair)のイテレータを返します。このペアは、指定したキーと等価なキーを持つコンテナ内のすべての要素を含む範囲の境界を表し