【C++学習|初心者向け】【C++入門】同じキーを複数持てる!std::multimapの基本と活用術

1. 導入:なぜstd::multimapが重要なのか

C++の標準ライブラリには、キーと値をペアで管理する「std::map」があります。しかし、std::mapは「1つのキーに対して値は1つだけ」という制限があります。例えば、「ユーザーID(キー)」に対して「複数のログイン履歴(値)」を紐付けたい場合、std::mapでは工夫が必要です。
そこで登場するのが「std::multimap」です。これは、同じキーに対して複数の値を保持できるという特徴があり、データの重複が許容されるシステムや、カテゴリ分けされたリストを作成する際に非常に強力なツールとなります。

2. 基礎知識:std::multimapとは?

std::multimapは、連想コンテナの一種です。内部的には「赤黒木」というデータ構造で管理されており、データは常にキーの昇順で並べ替えられます。
最大のポイントは、重複するキーであっても、それぞれ別の要素として格納される点です。これにより、キーを指定して検索した際に、複数の値がヒットする仕組みになっています。

3. 実装と解決策

std::multimapを使うには、ヘッダーファイル「map」をインクルードします。データの追加には「insert」関数を使用します。
キーに関連付けられた値を取り出す際は、「equal_range」という便利な関数を使うのが一般的です。これを使うことで、特定のキーに一致する要素の範囲を一度に取得できます。

4. サンプルプログラム

以下のコードをコピーして、コンパイルして実行してみてください。

include <iostream>
include <map>
include <string>

int main() {
    // std::multimapの宣言:キーは文字列、値は整数
    std::multimap<std::string, int> m_map;

    // データの挿入(同じキー "A" に複数の値を設定)
    m_map.insert({"A", 100});
    m_map.insert({"A", 200});
    m_map.insert({"B", 300});

    // 特定のキー("A")に紐付くすべての値を取得する
    // equal_rangeは、範囲の開始位置と終了位置をペアで返します
    auto range = m_map.equal_range("A");

    std::cout << "キー 'A' に対応する値:" << std::endl;
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << std::endl;
    }

    return 0;
}

5. 応用・注意点

std::multimapを使用する際、初心者が陥りやすい注意点がいくつかあります。

・[]演算子が使えない
std::mapでは「m_map[“key”] = 10」のように配列風の操作が可能ですが、std::multimapではキーが重複する可能性があるため、[]演算子(添字演算子)は提供されていません。必ずinsert関数を使用しましょう。

・検索の効率
すべての要素を検索する必要がある場合は「equal_range」が最も効率的です。もし「単にキーが存在するかどうかだけ知りたい」のであれば、「count」関数を使うと、そのキーがいくつ含まれているかを素早く確認できます。

std::multimapを使いこなすと、複雑なデータ構造もシンプルに記述できるようになります。ぜひ日々の開発で活用してみてください!

コメント

タイトルとURLをコピーしました