C++ STLのmultimap::emplace()関数の使い方を徹底解説
本記事では、C++ STLで提供されているmultimap::emplace()関数の動作原理、構文、そして実際のコード例について詳しく解説します。
C++ STLのmultimapとは?
multimap(マルチマップ)は連想コンテナの一種で、mapコンテナと非常によく似た特性を持っています。キー(key)とマップされた値(mapped value)の組み合わせからなる要素を、特定の順序で格納することができます。mapとの最大の違いは、同じキーに対して複数の要素を関連付けできるという点です。また、データは内部的に常にキーに基づいて自動的にソートされて管理されます。
multimap::emplace()とは?
multimap::emplace()は、C++標準ライブラリの<map>ヘッダーで定義されている組み込み関数です。この関数は、渡された引数をもとに新しい要素をコンテナ内で直接構築し、挿入します。要素を1つ挿入するたびに、コンテナのサイズが1増加します。
同様の役割を持つinsert()関数は、既存のオブジェクトをコピーまたはムーブして要素を挿入するのに対し、emplace()は引数から直接要素を構築するため、余計な一時オブジェクトやコピーが発生せず、より効率的に動作するのが特徴です。
構文
multimap_name.emplace(args...);
パラメータ
この関数は以下のパラメータを受け取ります。
args − 挿入したい要素(キーと値)を構築するための引数を指定します。
戻り値
新しく挿入された要素の位置を指すイテレータを返します。
基本的な使用例
入力
std::multimap<char, int> odd, eve;
odd.insert({'a', 1});
odd.emplace('b', 3);出力
Odd: a:1 b:3
サンプルプログラム
#include <bits/stdc++.h>
using namespace std;
int main(){
// コンテナを作成
multimap<int, int> mul;
// emplaceを使って要素を挿入
mul.emplace(1, 10);
mul.emplace(4, 20);
mul.emplace(5, 30);
mul.emplace(2, 40);
mul.emplace(3, 50);
mul.emplace(4, 60);
cout << "\nmultimapの要素:\n";
cout << "KEY\tELEMENT\n";
for (auto i = mul.begin(); i != mul.end(); i++){
cout << i->first << "\t" << i->second << endl;
}
return 0;
}出力結果
上記のコードをコンパイルして実行すると、次のような出力が得られます。
multimapの要素: KEY ELEMENT 1 10 2 40 3 50 4 20 4 60 5 30
この出力から分かるように、キー「4」に対して2つの異なる値(20と60)が格納されており、multimapでは同一キーの重複が許可されていることが確認できます。さらに、挿入した順序に関係なく、要素はキー順に自動的にソートされて格納される点も重要なポイントです。
-
C++ STLにおけるemplace()とinsert()の違いと使い方
C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。emplaceとinsertの違いemplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。insert(): 既存の
-
C++のSTLでマルチマップ(multimap)を実装するプログラムの解説
マルチマップ(multimap)は、C++の標準テンプレートライブラリ(STL)が提供する連想コンテナの一つで、複数の要素が同じキーを持てるという点を除けば、マップ(map)とよく似ています。マルチマップでは、キー値とマップ値のペアそのものが一意である必要があります。使用する主な関数mm::find() – マルチマップ内でキー値 b を持つ要素を検索します。見つかった場合はその要素へのイテレータを、見つからない場合は end() イテレータを返します。mm::erase() – 指定したキー値(またはイテレータが指す要素)をマルチマップから削除します。mm::equal_range() –