multisetとは(setとの違い)?
- setと同じ順序付き集合ですが、重複を許すという点でsetと異なります。
- 基本的な使い方はsetと同じです。
- よく確率の問題で「袋に青玉を○個入れて、白玉を□個出したときに残りの玉の数は?」というのがありますが、そういうのとかに使えます。
- 参考(公式ドキュメント):multiset - cpprefjp C++日本語リファレンス
宣言
- #include <set>をして、
std::multiset<型名> mst;
と宣言します。宣言と同時に初期化したいときは、{}で括って
std::multiset<int> mst{ 3, 4, 2, 3 };
という風にします。
for文での表示
ソースコード
#include <iostream> #include <set> int main() { std::multiset<int> mst{ 3, 4, 2, 3 }; //表示 std::cout << "mst = { "; for(auto v: mst) { std::cout << v << ", "; } puts("}"); return 0; }
実行結果
- 重複は許すので3が2つ表示されます(setの場合は「st = { 2, 3, 4, }」と3が1つしか表示されません)
mst = { 2, 3, 3, 4, }
要素数の取得(size)
ソースコード
#include <iostream> #include <set> int main() { std::multiset<int> mst{ 3, 4, 2, 3 }; std::cout << "要素数:" << mst.size() << std::endl; }
実行結果
mst = { 2, 3, 4, }
追加(insert)
ソースコード
#include <iostream> #include <set> int main() { std::multiset<int> mst{ 3, 4, 2, 3 }; //8を追加 mst.insert(8); // 表示 std::cout << "mst = { "; for(auto v: mst){ std::cout << v << ", "; } puts("}"); return 0; }
実行結果
mst = { 2, 3, 3, 4, 8, }
要素の存在を確かめる(find)
- find(検索したい要素)をして、multisetの終端イテレータと一致しなければ存在すると評価されます。
ソースコード
#include <iostream> #include <set> int main() { std::multiset<int> mst{ 3, 4, 2, 3 }; //nがあるか調べる int n = 3; if (mst.find(n) != mst.end()) { std::cout << "n = " << n << "が存在" << std::endl; } else { std::cout << "n = " << n << "がない" << std::endl; } }
実行結果
- n = 5とすれば「n = 5がない」と出てきます。
n = 3が存在
要素の削除(erase)
- erase(値x)で含まれる全ての値xを削除できます。
- erase(イテレータite)で該当する単一の要素を削除できます。
ソースコード
#include <iostream> #include <set> int main() { std::multiset<int> mst{ 3, 3, 5, 6, 6, 7 }; // 「3」を全削除 mst.erase(3); // 「6」を1つだけ削除(イテレータ使用) auto ite = mst.find(6); mst.erase(ite); //表示 std::cout << "mst = { "; for(auto v: mst) { std::cout << v << ", "; } puts("}"); }
実行結果
mst = { 5, 6, }