C++ STLのmap::value_comp()関数とは?構文と使い方を実例付きで解説
本記事では、C++ STLにおけるmap::value_comp()関数の動作・構文・具体的な使用例について詳しく解説します。
C++ STLにおけるマップ(map)とは?
マップ(map)は連想コンテナの一種で、キー(key)と値(mapped value)の組み合わせからなる要素を、特定の順序で格納できるコンテナです。mapコンテナの内部では、データは常に対応するキーに基づいて自動的にソートされており、格納された各値には一意なキーを介してアクセスします。
map::value_comp()とは?
map::value_comp()は、C++ STLに標準で用意されている組み込み関数で、<map>ヘッダーファイル内で宣言されています。この関数は、mapコンテナが要素間の比較に使用している比較オブジェクトのコピーを返します。デフォルトでは、この比較オブジェクトは「小なり演算子(<)」と同じ働きをするように設定されています。
value_comp()が返すのは、関数ポインタあるいは関数オブジェクトの一種です。これは同じ型の2つの値(要素)を比較し、コンテナ内で最初の要素が2番目の要素よりも小さいと判定されればtrueを、そうでなければfalseを返します。mapの場合、比較の対象となるのはpair<const Key, T>型の要素同士であり、主にキー部分が比較に使われる点に注意してください。
構文
Map_name.value_comp();
パラメータ
この関数は引数(パラメータ)を受け取りません。
戻り値
この関数は、そのmapコンテナに関連付けられた比較オブジェクトを返します。
使用例
基本的な使い方
まずは、マップを作成し、value_comp()で比較オブジェクトを取得する基本形を見てみましょう。
map<char, int> newmap; newmap['a'] = 1; newmap['b'] = 2; newmap['c'] = 3; // マップの比較オブジェクトを取得 auto cmp = newmap.value_comp();
サンプルプログラム
次に、value_comp()を使ってマップの先頭要素から末尾要素までを順番に比較しながら出力する、完全なプログラムを示します。
#include <iostream>
#include <map>
using namespace std;
int main() {
map<char, int> TP = {
{ 'a', 10 },
{ 'b', 20 },
{ 'c', 30 },
{ 'd', 40 },
{ 'e', 50 },
};
// マップの末尾の要素を取得
auto temp = *TP.rbegin();
// 先頭を指すイテレータを取得
auto i = TP.begin();
cout << "マップ内の要素 : \n";
do {
cout << i->first << " = " << i->second << endl;
} while (TP.value_comp()(*i++, temp));
return 0;
}
出力
マップ内の要素 : a = 10 b = 20 c = 30 d = 40 e = 50
コードの解説
このプログラムの動作を順に見ていきましょう。
- rbegin():マップの末尾(この例では {'e', 50})を指すリバースイテレータを取得し、比較の基準となる要素
tempとして保存します。 - begin():マップの先頭を指すイテレータ
iを取得します。 - do-whileループ:
TP.value_comp()(*i++, temp)によって「現在の要素が末尾の要素より小さいか」を判定し、trueが返る限りループを継続して各要素のキーと値を出力します。
このようにvalue_comp()を利用することで、マップが内部的に保持しているソート順序に沿って要素を処理できます。なお、キーのみを比較対象にしたい場合はkey_comp()を使用するとよいでしょう。
-
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)のイテレータを返します。このペアは、指定したキーと等価なキーを持つコンテナ内のすべての要素を含む範囲の境界を表し