C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++ STLにおけるemplace()とinsert()の違いと使い方

C++ STLにおけるemplace操作は、オブジェクトの不要なコピーを回避し、insert操作よりも効率的に要素を挿入できる点が大きな特徴です。insert操作は既存オブジェクトへの参照を受け取るため、コンテナに挿入する際にコピー(またはムーブ)が発生します。一方、emplaceは渡された引数をコンテナ内で直接オブジェクトとして構築するため、余分なコストを抑えられます。

emplaceとinsertの違い

  • emplace(): 引数をコンテナに転送し、コンテナ内で直接オブジェクトを構築します(in-place構築)。一時オブジェクトの生成やコピーが不要なため効率的です。
  • insert(): 既存のオブジェクトへの参照を受け取り、そのコピーをコンテナに挿入します。

アルゴリズム

Begin
   setを宣言する。
   emplace()を使ってペアを挿入する。
   insert()を使ってペアを挿入する。
   setの内容を出力する。
End

サンプルコード

#include<bits/stdc++.h>
using namespace std;
int main() {
   set<pair<int, char>> s;
   s.emplace(7, 'a');
   s.insert(make_pair(6, 'b'));
   for (auto it = s.begin(); it != s.end(); ++it)
      cout << " " << (*it).first << " " << (*it).second << endl;
   return 0;
}

実行結果

7 a
6 b

まとめ

この例では、set<pair<int, char>>を宣言し、emplace()でペア(7, 'a')を直接構築して挿入するとともに、insert()make_pair()を組み合わせてペア(6, 'b')を挿入しています。どちらの方法でも要素をsetに格納できますが、一時オブジェクトの生成やコピーのコストを避けたい場合はemplace()を使う方が効率的です。特に、重いオブジェクトを扱う場面ではパフォーマンスの違いが顕著に現れます。

  1. C++ STLのmultimap::find()関数の使い方と実例解説

    本記事では、C++ STLにおけるmultimap::find()関数の動作、構文、および具体的な使用例について詳しく解説します。C++ STLにおけるmultimapとは?multimapは連想コンテナ(associative container)の一種で、mapコンテナと非常によく似た性質を持っています。キー値とマップされた値(mapped value)の組み合わせからなる要素を、特定の順序で格納することができます。mapとの最大の違いは、同じキーに対して複数の要素を関連付けられるという点です。また、コンテナ内のデータは、内部で常にキーに基づいて自動的にソートされるという特徴もあります。m

  2. C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード

    C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス