C++のSTLでマルチマップ(multimap)を実装するプログラムの解説
マルチマップ(multimap)は、C++の標準テンプレートライブラリ(STL)が提供する連想コンテナの一つで、複数の要素が同じキーを持てるという点を除けば、マップ(map)とよく似ています。マルチマップでは、キー値とマップ値のペアそのものが一意である必要があります。
使用する主な関数
mm::find() – マルチマップ内でキー値 'b' を持つ要素を検索します。見つかった場合はその要素へのイテレータを、見つからない場合は end() イテレータを返します。
mm::erase() – 指定したキー値(またはイテレータが指す要素)をマルチマップから削除します。
mm::equal_range() – ペアのイテレータを返します。このペアは、指定したキーと等価なキーを持つコンテナ内のすべての要素を含む範囲の境界(first と second)を表します。
mm::insert() – マルチマップコンテナに要素を挿入します。
mm::size() – マルチマップコンテナに格納されている要素数を返します。
サンプルコード
#include<iostream>
#include <map>
#include <string>
using namespace std;
int main () {
multimap<char, int> mm;
multimap<char, int>::iterator it;
mm.insert (pair<char, int>('a', 10));
mm.insert (pair<char, int>('b', 20));
mm.insert (pair<char, int>('b', 30));
mm.insert (pair<char, int>('a', 40));
cout<<"Size of the multimap: "<< mm.size() <<endl;
cout << "Multimap contains:\n";
for (it = mm.begin(); it != mm.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
for (char c = 'a'; c <= 'b'; c++) {
cout << "There are " << mm.count(c) << " elements with key " << c << ":";
multimap<char, int>::iterator it;
for (it = mm.equal_range(c).first; it != mm.equal_range(c).second; ++it)
cout << ' ' << (*it).second;
cout << endl;
}
it = mm.find('b');
mm.erase (it);
cout<<"Size of the multimap: "<<mm.size()<<endl;
cout << "Multimap contains:\n";
for (it = mm.begin(); it != mm.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
return 0;
}実行結果
Size of the multimap: 4 Multimap contains: a => 10 a => 40 b => 20 b => 30 There are 2 elements with key a: 10 40 There are 2 elements with key b: 20 30 Size of the multimap: 3 Multimap contains: a => 10 a => 40 b => 30
コードの解説
このプログラムでは、まず insert() を使って4つの要素を挿入しています。キー 'a' と 'b' にはそれぞれ2つの値が関連付けられているため、size() は 4 を返します。
次に、equal_range() を使って同じキーを持つ要素の範囲を取得し、count() と組み合わせて各キーの要素数と値を表示しています。equal_range() が返すペアの first は範囲の先頭、second は範囲の末尾を指すため、for ループで範囲内のすべての要素にアクセスできます。
その後、find() でキー 'b' の最初の要素を検索し、erase() で削除しています。削除後は要素数が 3 になり、キー 'b' には値 30 のみが残っていることが出力から確認できます。
-
C++のSTLでset_intersectionを実装し、2つの集合の積集合を求める方法
2つの集合の積集合(インターセクション)とは、両方の集合に共通して含まれる要素だけを集めたものです。set_intersection関数によってコピーされる要素は、必ず最初の集合から取り出され、元の順序がそのまま維持されます。また、この関数を正しく動作させるためには、処理前に両方の集合がそれぞれソート済みである必要があります。 集合に対する代表的な操作には、以下のようなものがあります。 和集合(ユニオン) 積集合(インターセクション) 対称差(排他的論理和・XOR) 差集合(減算) アルゴリズム Begin 結果を格納するvector型変数vとイテレータstを宣言する。 st =
-
【C++】STLのset_differenceを使って2つの集合の差分を求める方法
2つの集合の「差(差集合)」とは、1つ目の集合には存在するが、2つ目の集合には存在しない要素だけから構成される集合のことです。set_difference関数によってコピーされる要素は、必ず1つ目の集合から取り出され、元の順序が保たれます。また、この関数を正しく動作させるためには、両方の集合があらかじめソート(整列)されている必要があります。代表的な集合演算には以下のようなものがあります。和集合(Union)積集合(Intersection)対称差(Symmetric Difference / 排他的論理和)差集合(Difference / 減算)アルゴリズムBegin 集合用のvec