0Pricing
C++ Academy · レッスン

multimapとmultiset

重複するキーを許可します

「multimapとmultiset」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

重複を許可するコンテナ

std::multimap と std::multiset は map や set に似ていますが、重複キーを許可します。要素は常にソートされた状態です。

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 3, 3, 3};
    for (int x : ms) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

multiset への挿入

multiset への insert() は、同じ値を繰り返し挿入する場合でも必ず成功し、挿入するたびにコンテナが大きくなります。

#include <iostream>
#include <set>

int main() {
    std::multiset<std::string> ms;
    ms.insert("a");
    ms.insert("a");
    ms.insert("a");
    std::cout << ms.size() << " elements\n";
    return 0;
}

重複数のカウント

count() は、値が何回現れるかを返すようになり、1より大きい値になる場合があります。

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{5, 5, 5, 7, 9, 9};
    std::cout << "5 appears " << ms.count(5) << " times\n";
    std::cout << "9 appears " << ms.count(9) << " times\n";
    return 0;
}

すべて削除する場合と1つだけ削除する場合

erase(key) は一致する要素をすべて削除します。1つだけ削除するには、find() で得た単一のイテレータを erase します。

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 2, 3};
    ms.erase(ms.find(2));
    std::cout << "count of 2: " << ms.count(2) << '\n';
    return 0;
}

multimap の基本

std::multimap はキーを値に対応付けますが、1つのキーに複数の値を対応付けられます。注意: operator[] はありません。

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm;
    mm.insert({"fruit", 1});
    mm.insert({"fruit", 2});
    mm.insert({"veg", 3});
    std::cout << mm.size() << " pairs\n";
    return 0;
}

multimap の反復処理

反復処理では、キーの昇順にソートされたすべてのペアが返されます。重複したキーも含まれます。

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm{{"a", 1}, {"a", 2}, {"b", 3}};
    for (const auto& [k, v] : mm) {
        std::cout << k << " => " << v << '\n';
    }
    return 0;
}

equal_range

equal_range(key) は、そのキーを持つすべての要素を範囲として示す2つのイテレータのペアを返します。キーに対応するすべての値を読み取る標準的な方法です。

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm{{"x", 10}, {"x", 20}, {"y", 30}};
    auto range = mm.equal_range("x");
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << ' ';
    }
    std::cout << '\n';
    return 0;
}

データのグループ化

multimap はグループ化に最適です。たとえば、複数の人を同じ都市に対応付けられます。

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, std::string> byCity{
        {"NYC", "Alice"}, {"NYC", "Bob"}, {"LA", "Carol"}
    };
    auto r = byCity.equal_range("NYC");
    for (auto it = r.first; it != r.second; ++it)
        std::cout << it->second << '\n';
    return 0;
}

multiset での lower_bound

順序付きの範囲検索も引き続き利用できます。lower_bound は、対象値以上である最初の要素を検索します。

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 3, 4};
    auto it = ms.lower_bound(2);
    std::cout << "first >= 2 is " << *it << '\n';
    return 0;
}

ソートされた頻度リスト

要素は常にソートされているため、multiset を使うと重複を維持した順序付きの出力を自然に作成できます。

#include <iostream>
#include <set>

int main() {
    std::multiset<int> scores{90, 75, 90, 60, 75, 90};
    for (int s : scores) std::cout << s << ' ';
    std::cout << '\n';
    return 0;
}

全要素数と異なる要素数

size() は重複を含むすべての要素を数えます。一方、異なるキーだけを反復処理するには、自分で重複をスキップする必要があります。

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 1, 2, 3, 3};
    std::cout << "total: " << ms.size() << '\n';
    std::cout << "count of 1: " << ms.count(1) << '\n';
    return 0;
}

クイックチェック

multiset からの要素の削除について、理解度を確認しましょう。

まとめ

multimap と multiset について、次のことを学びました。

  • ソートされた状態を保ちながら重複キーを許可する
  • 同じキーを共有するすべての値を読み取るには equal_range を使う
  • erase(key) は一致する要素をすべて削除し、イテレータを削除すると1つだけ削除する

次は、カスタム比較関数を使って順序を制御します。

よくある質問

「multimapとmultiset」レッスンは無料ですか?

はい。「multimapとmultiset」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「multimapとmultiset」で何を学びますか?

重複するキーを許可します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「multimapとmultiset」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::map
  2. std::set
  3. multimapとmultiset
  4. カスタム比較関数
← C++ Academyに戻る