C++ STLのmap::insert()関数の使い方と実例を徹底解説
本記事では、C++ STLにおけるmap::insert()関数の動作、構文、および具体的な使用例について詳しく解説します。
C++ STLにおけるマップ(map)とは?
マップは連想コンテナの一種で、キー値とマップされた値の組み合わせからなる要素を、特定の順序で格納することを可能にします。マップコンテナでは、データは内部において常にキーに基づいてソートされており、各要素には一意なキーを通じてアクセスします。
map::insert()とは?
map::insert()は、C++ STLに組み込まれた関数であり、<map>ヘッダーファイル内で定義されています。この関数は、マップコンテナに新しい要素を挿入するために使用され、挿入された要素の数だけコンテナのサイズが増加します。
マップコンテナのキーは一意であるため、insert()による挿入操作では、挿入しようとする要素のキーがすでにコンテナ内に存在するかどうかがチェックされます。もし同じキーが存在する場合、その要素は挿入されません。
また、マップコンテナはすべての要素をそれぞれのキーに基づいて昇順に管理しています。そのため、要素を挿入すると、そのキーに応じた適切な位置へ自動的に配置されます。
構文
1. Map_name.insert({key& k, value_type& val});
または
2. Map_name.insert(iterator& it, {key& k, value_type& val});
または
3. Map_name.insert(iterator& position1, iterator& position2);パラメータ
この関数は以下のパラメータを受け取ります。
k − 要素に関連付けられるキーです。すでにコンテナ内に同じキーが存在する場合、要素は挿入されません。
val − 挿入する値です。
it − 要素を挿入したい位置を指定するためのイテレータ型の値です。
position1, position2 − 複数の要素をまとめて挿入したい場合に使用します。position1は開始位置、position2は終了位置を示し、範囲内の一連の要素を挿入できます。
戻り値
この関数は、マップコンテナに新しく挿入された要素へのイテレータを返します。
使用例
例1:基本的な挿入
入力
map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
newmap.insert({'d', 50});出力
a:1 b:2 c:3 d:50
例2:insert()を使ったプログラム全体
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.insert({3, 50});
TP_Map.insert({2, 30});
TP_Map.insert({1, 10});
TP_Map.insert({4, 70});
cout<<"TP Map is : \n";
cout << "MAP_KEY\tMAP_ELEMENT\n";
for (auto i = TP_Map.begin(); i!= TP_Map.end(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}出力
TP Map is: MAP_KEY MAP_ELEMENT 1 10 2 30 3 50 4 70
この例では、要素を挿入した順序にかかわらず、出力結果がキーの昇順(1、2、3、4)に並んでいる点に注目してください。これは、マップコンテナが常にキーに基づいて自動的にソートを行うためです。
例3:イテレータを指定した挿入
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.insert({3, 50});
TP_Map.insert({2, 30});
TP_Map.insert({1, 10});
TP_Map.insert({4, 70});
auto i = TP_Map.find(4);
TP_Map.insert(i, { 5, 80 });
cout<<"TP Map is : \n";
cout << "MAP_KEY\tMAP_ELEMENT\n";
for (auto i = TP_Map.begin(); i!= TP_Map.end(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}出力
TP Map is: MAP_KEY MAP_ELEMENT 1 10 2 30 3 50 4 70 5 80
この例では、find(4)で取得したイテレータ位置をヒントとして指定し、キー5の要素を挿入しています。イテレータを渡す形式の場合、検索の開始地点としてヒントが利用されるため、適切な位置を指定すれば挿入処理の効率が向上する可能性があります。ただし、最終的な配置位置はあくまでキーの順序に従って決定されます。
まとめ
map::insert()は、C++のマップコンテナに新しいキーと値のペアを追加するための基本かつ重要な関数です。重複するキーを持つ要素は挿入されず、常にキーに基づいた昇順で要素が管理されるという特性を理解しておくことで、より効率的で安全なコードを書くことができます。
-
C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説
セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:
-
C++ STLにおけるemplace()とinsert()の違いと使い方
C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。emplaceとinsertの違いemplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。insert(): 既存の