STLのマップ(map)を実装するC++プログラムの書き方
マップ(map)とは
マップは、要素をキーと値のペアとして対応付けて格納する連想コンテナです。各要素はキー値とマップ値を持ち、同じキー値を持つ要素が複数存在することはありません。
使用する主なメンバ関数
m::find() – マップ内に指定したキー値('b')を持つ要素が見つかれば、その要素へのイテレータを返します。見つからない場合はend()へのイテレータを返します。
m::erase() – マップから指定したキー値の要素を削除します。
m::equal_range() – ペア(pair)のイテレータを返します。このペアは、指定したキーと等価なキーを持つコンテナ内のすべての要素を含む範囲の境界を表します。
m::insert() – マップコンテナに要素を挿入します。
m::size() – マップコンテナ内の要素数を返します。
m::count() – マップ内にキー値('a'や'f'など)に一致する要素がいくつ存在するかを返します。
サンプルコード
#include<iostream>
#include <map>
#include <string>
using namespace std;
int main () {
map<char, int> m;
map<char, int>::iterator it;
m.insert (pair<char, int>('a', 10));
m.insert (pair<char, int>('b', 20));
m.insert (pair<char, int>('c', 30));
m.insert (pair<char, int>('d', 40));
cout<<"Size of the map: "<< m.size() <<endl;
cout << "map contains:\n";
for (it = m.begin(); it != m.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
for (char c = 'a'; c <= 'd'; c++) {
cout << "There are " << m.count(c) << " element(s) with key " << c << ":";
map<char, int>::iterator it;
for (it = m.equal_range(c).first; it != m.equal_range(c).second; ++it)
cout << ' ' << (*it).second;
cout << endl;
}
if (m.count('a'))
cout << "The key a is present\n";
else
cout << "The key a is not present\n";
if (m.count('f'))
cout << "The key f is present\n";
else
cout << "The key f is not present\n";
it = m.find('b');
m.erase (it);
cout<<"Size of the map: "<<m.size()<<endl;
cout << "map contains:\n";
for (it = m.begin(); it != m.end(); ++it)
cout << (*it).first << " => " << (*it).second << '\n';
return 0;
}実行結果
Size of the map: 4 map contains: a => 10 b => 20 c => 30 d => 40 There are 1 element(s) with key a: 10 There are 1 element(s) with key b: 20 There are 1 element(s) with key c: 30 There are 1 element(s) with key d: 40 The key a is present The key f is not present Size of the map: 3 map contains: a => 10 c => 30 d => 40
このサンプルでは、まず4つの要素をマップに挿入し、size()で要素数を確認した後に全要素を表示しています。続いてcount()とequal_range()を使って各キーの存在確認を行い、find()で取得したイテレータをerase()に渡すことでキー'b'の要素を削除しています。最終的にマップのサイズが3になり、キー'b'の要素だけが取り除かれたことが確認できます。
-
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