C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++ STLのmultimap::find()関数の使い方と実例解説

本記事では、C++ STLにおけるmultimap::find()関数の動作、構文、および具体的な使用例について詳しく解説します。

C++ STLにおけるmultimapとは?

multimapは連想コンテナ(associative container)の一種で、mapコンテナと非常によく似た性質を持っています。キー値とマップされた値(mapped value)の組み合わせからなる要素を、特定の順序で格納することができます。

mapとの最大の違いは、同じキーに対して複数の要素を関連付けられるという点です。また、コンテナ内のデータは、内部で常にキーに基づいて自動的にソートされるという特徴もあります。

multimap::find()とは?

multimap::find()は、C++ STLに組み込まれたメンバ関数で、<map>ヘッダーファイル内で定義されています。

find()は、コンテナ内から指定したキーKに関連付けられた要素を検索し、その要素を指すイテレータを返します。要素が見つかった場合はその位置を指すイテレータを、見つからなかった場合はend()イテレータを返します。

構文

iterator multimap_name.find(key);

パラメータ

この関数は、コンテナ内で検索したいキーを指定する引数keyを1つ受け取ります。

戻り値

キーがコンテナ内に存在する場合、そのキーの位置を参照するイテレータを返します。該当するキーが存在しない場合は、end()と同等のイテレータが返されます。

入力例1

multimap<char, int> newmap;
newmap.insert(make_pair('A', 22));
newmap.insert(make_pair('B', 78));
newmap.insert(make_pair('C', 66));
newmap.insert(make_pair('D', 81));
newmap.insert(make_pair('E', 43));

newmap.find('D');

出力

81

入力例2

multimap<int, int> newmap;
newmap.insert(make_pair(1, 15));
newmap.insert(make_pair(2, 18));
newmap.insert(make_pair(3, 45));
newmap.insert(make_pair(4, 66));

newmap.find(4);

出力

66

基本的な手順

  • まず、multimapを初期化します。

  • 次に、キーと値のペアを要素として挿入します。

  • find()関数を使用して、目的のキーの位置を検索します。

  • 最後に、取得したキーと対応する要素を出力します。

この手順に従うことで、コンテナ内の任意のキーを検索できます。さらに、find()で取得したイテレータを起点にすれば、特定の範囲内にあるキーや要素を順番に処理することも可能です。

サンプルコード1

#include <iostream>
#include <map>
using namespace std;

int main() {
    multimap<char, int> mp;

    // 要素の挿入
    mp.insert({'b', 23});
    mp.insert({'a', 46});
    mp.insert({'c', 78});
    mp.insert({'e', 11});
    mp.insert({'d', 34});

    cout << "キー 'c' 以降の要素 : \n";
    cout << "Key\tElement\n";
    for (auto i = mp.find('c'); i != mp.end(); i++)
        cout << i->first << "\t" << i->second << '\n';

    return 0;
}

出力結果1

上記のコードを実行すると、以下のような出力が得られます。

KEY ELEMENT
c 78
d 34
e 11

この例では、find('c')によってキー'c'の位置を取得し、そこからend()までループ処理を行うことで、キー'c'以降に格納されているすべての要素を出力しています。

サンプルコード2

#include <iostream>
#include <map>
using namespace std;

int main() {
    multimap<char, int> mp;

    // 要素の挿入
    mp.insert({'1', 33});
    mp.insert({'2', 66});
    mp.insert({'3', 55});
    mp.insert({'4', 11});
    mp.insert({'5', 44});

    cout << "キー '4' 以降の要素 : \n";
    cout << "Key\tElement\n";
    for (auto i = mp.find('4'); i != mp.end(); i++)
        cout << i->first << "\t" << i->second << '\n';

    return 0;
}

出力結果2

上記のコードを実行すると、以下のような出力が得られます。

KEY ELEMENT
4 11
5 44

まとめ

multimap::find()を使えば、multimapコンテナ内から特定のキーを効率的に検索できます。戻り値のイテレータは、単一要素へのアクセスだけでなく、範囲ベースの処理(キー以降の全要素の走査など)にも活用できるため、非常に便利な関数です。なお、同一キーが複数存在するmultimapの特性上、find()はそのうちのいずれか1つを返す点には注意が必要です。すべての同一キー要素を取得したい場合は、lower_bound()やequal_range()と組み合わせて使用すると効果的です。

  1. C++ STLのlist insert()関数の使い方を徹底解説

    本記事では、C++のSTLにおけるlistコンテナのinsert()関数の機能と使い方について詳しく解説します。 STLのlistとは listは、シーケンス内の任意の位置に対して定数時間での挿入と削除を可能にするコンテナです。listは双方向連結リストとして実装されており、非連続的なメモリ割り当てを行います。配列、vector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は低速です。listはforward_listと似ていますが、forward_listは単方向連結リストで

  2. C++ STLにおけるemplace()とinsert()の違いと使い方

    C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。emplaceとinsertの違いemplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。insert(): 既存の