【C++ STL】map::emplace()の使い方を解説!構文・戻り値・サンプルコード付き
本記事では、C++ STLにおけるmap::emplace()関数の動作、構文、そして具体的な使用例について詳しく解説します。
C++ STLにおけるマップ(std::map)とは?
マップは連想コンテナの一種で、キー(key)と対応する値(mapped value)の組み合わせからなる要素を、決まった順序で格納することができます。マップコンテナ内部では、データは常にキーに基づいて自動的にソートされて管理され、各要素へは一意なキーを通じてアクセスします。
map::emplace()とは?
map::emplace()は、<map>ヘッダーファイルで定義されている関数で、マップコンテナに対して要素をその場で構築(construct)しながら挿入します。
emplace()は、挿入しようとする要素のキーがコンテナ内にまだ存在しない場合(キーが一意である場合)にのみ、新しい要素を挿入します。同じキーを持つ要素がすでに存在する場合は、挿入は行われません。
従来のinsert()は既存のオブジェクトをコピーまたはムーブしてコンテナに格納しますが、emplace()はコンテナ内で直接要素を構築するため、余分な一時オブジェクトの生成やコピーが発生せず、多くの場合により効率的に動作します。
要素の挿入に成功すると、コンテナのサイズは1増加します。
構文
map_name.emplace(Args&& args);
パラメータ
この関数は次のパラメータを受け取ります。
args − マップに挿入したい要素を構築するための引数(キーや値など)。
戻り値
挿入が成功した場合は、新しく挿入された要素を指すイテレータとtrueを含むペア(pair<iterator, bool>)を返します。同じキーを持つ要素がすでに存在し、挿入が行われなかった場合は、既存の等価な要素を指すイテレータとfalseを含むペアを返します。
簡単な使用例
map<char, int> newmap;
newmap.emplace('a', 1);
cout << newmap.begin()->first;
出力
a
サンプルプログラム
次の例では、int型のキーとint型の値を持つマップ「TP_Map」を作成し、emplace()を使って複数の要素を挿入しています。ポイントは、キー「1」に対して3回emplace()を呼び出している点です。最初のemplace(1, 10)のみが挿入され、その後のemplace(1, 20)とemplace(1, 30)は同じキーがすでに存在するため無視されます。
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_Map;
TP_Map.emplace(4, 50);
TP_Map.emplace(2, 30);
TP_Map.emplace(1, 10);
TP_Map.emplace(1, 20);
TP_Map.emplace(1, 30);
cout << "TP Map is :" << endl;
cout << "MAP_KEY" << '\t' << "MAP_ELEMENT" << endl;
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 4 50
まとめ
map::emplace()は、キーの重複を自動的にチェックしながら、要素を直接構築してマップに挿入できる便利な関数です。不要なコピー処理を省けるため、パフォーマンスが求められる場面で特に有効です。同じキーがすでに存在する場合には挿入が行われない点も、安全にデータを管理するうえで重要な特徴といえます。
-
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(): 既存の