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

C++ STLのdeque::emplace()関数の使い方を徹底解説


この記事では、C++ STLにおけるdequeのemplace()関数の機能と使い方について詳しく解説します。

Deque(両端キュー)とは?

Dequeは「Double Ended Queue(両端キュー)」の略で、コンテナの先頭と末尾の両方で要素の挿入・削除が可能なシーケンスコンテナです。通常のキュー(待ち行列)データ構造では、データの挿入は末尾からのみ行い、削除は先頭からのみ行います。バス停の行列を想像すると分かりやすいでしょう。新しい人は列の末尾に並び、先頭にいる人から順に乗車していきます。一方、両端キューでは、先頭と末尾のどちら側からでもデータの挿入・削除が自由に行えます。

emplace()関数とは?

emplace()関数は、deque内の指定した位置の直前に新しい要素を挿入し、コンテナのサイズを1つ増やします。emplace()の大きな特徴は、要素をコピーせずにコンテナ内で直接構築(in-place構築)できる点です。そのため、大きなオブジェクトを扱う場合には、挿入時のコピーコストを削減でき、パフォーマンス面で有利になることがあります。

構文

iterator emplace(const_iterator position, value_type value);

パラメータ

position − コンテナ内で新しい要素を挿入する位置を指定します。

value − コンテナに挿入する新しい値(引数)を指定します。

戻り値 − 新しく挿入された要素を指すイテレータを返します。

使用例

入力 Deque − 96 97 98 100

出力 新しい要素挿入後のDeque − 96 97 98 99 100

入力 Deque − C P T A I N

出力 新しい要素挿入後のDeque − C A P T A I N

実行手順

  • まず、dequeを宣言します。

  • 次に、dequeの内容を出力します。

  • 次に、emplace()関数を呼び出します。

  • 最後に、新しい要素を挿入した後のdequeを出力します。

この手順に従うことで、dequeに新しい要素を挿入できます。emplace()関数を呼び出す際には、挿入位置と挿入する新しい値の2つを引数として指定します。

例1:数値の挿入

// deque emplace()関数の動作を示すC++コード
#include <iostream>
#include <deque>
using namespace std;
int main() {
    // dequeの初期化
    deque<int> deq = { 85, 87, 88, 89, 90 };
    // dequeの内容を出力
    cout << "Deque: ";
    for (auto x = deq.begin(); x != deq.end(); ++x)
        cout << *x << " ";
    // emplace()関数の呼び出し(先頭から2番目の位置に86を挿入)
    deq.emplace(deq.begin() + 1, 86);
    // 新しい要素挿入後のdequeを出力
    cout << "\nNew Deque: ";
    for (auto x = deq.begin(); x != deq.end(); ++x)
        cout << *x << " ";
    return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます。

入力 - Deque: 85 87 88 89 90
出力 - New Deque: 85 86 87 88 89 90

例2:文字の挿入

// deque emplace()関数の動作を示すC++コード
#include <iostream>
#include <deque>
using namespace std;
int main() {
    // dequeの初期化
    deque<char> deq = { 'L', 'A', 'C', 'K' };
    // dequeの内容を出力
    cout << "Deque: ";
    for (auto x = deq.begin(); x != deq.end(); ++x)
        cout << *x << " ";
    // emplace()関数の呼び出し(先頭に'B'を挿入)
    deq.emplace(deq.begin(), 'B');
    // 新しい要素挿入後のdequeを出力
    cout << "\nNew Deque: ";
    for (auto x = deq.begin(); x != deq.end(); ++x)
        cout << *x << " ";
    return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます。

入力 - Deque: L A C K
出力 - New Deque: B L A C K

まとめ

deque::emplace()関数を使うことで、指定した位置に要素を直接構築して効率的に挿入できます。イテレータで挿入位置を指定できるため、先頭や末尾だけでなくコンテナ内の任意の場所への挿入が可能です。C++で両端キューを柔軟に操作したい場合に、ぜひ活用してみてください。

  1. C++ STLのdeque::assign()関数の使い方を徹底解説

    本記事では、C++ STLにおける deque::assign() 関数の動作について詳しく解説します。デック(deque)は「double ended queue(両端キュー)」と呼ばれるデータ構造で、先頭と末尾の両方から要素の挿入・削除が可能なコンテナです。C++の deque::assign() は組み込み関数の一つで、dequeコンテナに新しい値を割り当てるために使用されます。この関数が呼び出されるたびに、既存の要素をすべて置き換えて新しい値を設定し、それに応じてコンテナのサイズも自動的に調整されます。構文deque::assign() の構文は以下の通りです。dequename.as

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

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