C++ STLのmap::at()とmap::swap()の使い方を徹底解説!構文・パラメータ・実行例つき
本記事では、C++ STLにおけるmap::at()関数とmap::swap()関数の動作、構文、具体的な使用例について詳しく解説します。
C++ STLにおけるmapとは?
map(マップ)は連想コンテナの一種で、キー値とそれに対応する値(mapped value)のペアからなる要素を、特定の順序で格納できるコンテナです。mapコンテナ内部のデータは、常にキーに基づいて自動的にソートされます。また、map内の各要素の値には、重複しない一意のキーを通じてアクセスします。
map::at()とは?
map::at()関数は、C++ STLに標準で用意されている組み込み関数で、<map>ヘッダーファイル内で定義されています。at()は、mapコンテナ内の特定の要素にアクセスするために使用され、指定したキーに関連付けられた値への参照を返します。
もし指定したキーがmapコンテナ内のどのキーとも一致しない場合、この関数はout_of_range例外を送出します。
構文
map_name.at(key& k);
パラメータ
この関数は1つのパラメータを受け取ります。
- k − アクセスしたい要素のキー。
戻り値
検索対象であるキーkに関連付けられた値への参照を返します。
使用例
入力:
std::map<char, int> mymap;
mymap.insert({'a', 10});
mymap.insert({'b', 20});
mymap.insert({'c', 30});
mymap.at('b');
出力:
b:20
次に、実際に動作する完全なサンプルコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_1;
map<int, int> TP_2;
TP_1[1] = 10;
TP_1[2] = 20;
TP_1[3] = 30;
TP_1[4] = 40;
TP_2[5] = 50;
TP_2[6] = 60;
TP_2[7] = 70;
cout << "Elements at TP_1[1] = " << TP_1.at(1) << endl;
cout << "Elements at TP_1[2] = " << TP_1.at(2) << endl;
cout << "Elements at TP_1[3] = " << TP_1.at(3) << endl;
cout << "\nElements at TP_2[7] = " << TP_2.at(7) << endl;
cout << "Elements at TP_2[5] = " << TP_2.at(5) << endl;
return 0;
}
出力:
Elements at TP_1[1] = 10 Elements at TP_1[2] = 20 Elements at TP_1[3] = 30 Elements at TP_2[7] = 70 Elements at TP_2[5] = 50
map::swap()とは?
map::swap()関数も、C++ STLの組み込み関数で、<map>ヘッダーファイル内で定義されています。swap()は、2つのmapコンテナの内容を入れ替えるために使用されます。この関数は、両方のmapコンテナのサイズに関係なく、内容を交換できる点が特徴です。
この関数が呼び出されると、引数として渡された別のmapコンテナの内容と、呼び出し元のコンテナの内容を入れ替えます。
構文
map_name.swap(map& map_name2);
パラメータ
この関数は1つのパラメータを受け取ります。
- map_name2 − 呼び出し元のmapコンテナと内容を入れ替えたい、もう一方のmapコンテナのオブジェクト。
戻り値
この関数は何も返しません(void型)。
使用例
入力:
std::map<char, int> odd, eve;
odd.insert({'a', 1});
odd.insert({'b', 3});
odd.insert({'c', 5});
eve.insert({'d', 2});
eve.insert({'e', 4});
eve.insert({'f', 6});
odd.swap(eve);
出力:
Odd: d:2 e:4 f:6 Eve: a:1 b:3 c:5
続いて、swap()を使った完全なサンプルコードです。
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_1;
map<int, int> TP_2;
TP_1[1] = 10;
TP_1[2] = 20;
TP_1[3] = 30;
TP_1[4] = 40;
TP_2[5] = 50;
TP_2[6] = 60;
TP_2[7] = 70;
swap(TP_1, TP_2);
cout << "Elements of TP_1 after swap:\n" << "\tKEY\tELEMENT\n";
for (auto i = TP_1.begin(); i != TP_1.end(); i++) {
cout << "\t" << i->first << "\t" << i->second << '\n';
}
cout << "Elements of TP_2 after swap:\n" << "\tKEY\tELEMENT\n";
for (auto i = TP_2.begin(); i != TP_2.end(); i++) {
cout << "\t" << i->first << "\t" << i->second << '\n';
}
return 0;
}
出力:
Elements of TP_1 after swap: KEY ELEMENT 5 50 6 60 7 70 Elements of TP_2 after swap: KEY ELEMENT 1 10 2 20 3 30 4 40
まとめ
map::at()は、キーを指定してmap内の要素に安全にアクセスするための関数で、キーが存在しない場合はout_of_range例外を送出します。一方、map::swap()は、2つのmapコンテナの内容を効率よく入れ替えるための関数です。どちらも<map>ヘッダーに含まれており、mapを扱うプログラムにおいて非常に便利な機能なので、ぜひ活用してみてください。
-
C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説
セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:
-
C++ STLのmap・multimapを降順で扱う方法
一般に、C++のmapおよびmultimapは、デフォルトではキーを昇順で格納します。しかし、第3テンプレート引数として比較用の関数オブジェクトstd::greaterを指定することで、要素を降順で格納することも簡単にできます。 mapを降順で使用する 使用する主なメンバ関数 m.find() – 指定したキーを持つ要素へのイテレータを返します。見つからない場合はend()イテレータを返します。 m.erase() – マップから指定したキーの要素を削除します。 m.equal_range() – イテレータのペア(pair)を返します。このペアは、指定したキーと等しいキーを持つすべての要素