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フィードバックを取得できます。ローカル設定は不要です。