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

C++ STLのdeque emplace_front()とemplace_back()関数の使い方を解説

C++ STLにおけるdeque(両端キュー)のemplace_front()関数とemplace_back()関数の機能を、サンプルコードと実行結果とともにわかりやすく解説します。

Deque(両端キュー)とは

Deque(デック)は「Double Ended Queue(両端キュー)」の略で、シーケンスコンテナの一種です。最大の特徴は、コンテナの先頭と末尾の両方で要素の追加・削除ができる点にあります。

通常のキュー(queue)データ構造では、データの挿入は末尾からのみ、削除は先頭からのみ行えます。バス停の行列をイメージすると分かりやすいでしょう。新しい人は列の末尾に並び、先頭にいる人から順に乗車して列から外れていきます。一方、両端キューでは、先頭と末尾のどちらからでもデータの挿入と削除が可能です。

emplace_front()関数とは

emplace_front()関数は、dequeの先頭に新しい要素を挿入するメンバ関数です。push_front()と似ていますが、emplace系の関数は要素をコンテナ内で直接構築(in-place構築)できるため、一時オブジェクトの生成やコピー・ムーブのコストを抑えられる点がメリットです。

構文

dequename.emplace_front(value)

パラメータ

value − dequeの先頭に挿入する新しい要素を指定します。要素のデータ型は、dequeの宣言時に指定した型と一致している必要があります。

使用例

入力 Deque − 12 13 14 15 16
出力 New Deque − 11 12 13 14 15 16

入力 Deque − O R C E
出力 New Deque − F O R C E

処理の手順

  • まず、dequeを宣言して初期化します。
  • 初期状態のdequeを表示します。
  • emplace_front()関数を呼び出し、先頭に新しい要素を挿入します。
  • 挿入後の新しいdequeを表示します。

この手順に従うことで、dequeの先頭に新しい要素を追加できます。関数を呼び出す際は、挿入したい新しい要素を引数として渡します。新しい要素のデータ型は、dequeの要素型と同じでなければなりません。

サンプルコード(emplace_front)

// deque emplace_front()関数の動作を示す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_front()で先頭に78を挿入
    deq.emplace_front(78);

    // 挿入後の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: 78 85 87 88 89 90

emplace_back()関数とは

emplace_back()関数は、emplace_front()と対をなす関数で、dequeの末尾に新しい要素を挿入します。使い方はemplace_front()とほぼ同じです。

構文

dequename.emplace_back(value)

サンプルコード(emplace_back)

// deque emplace_back()関数の動作を示すC++コード
#include <iostream>
#include <deque>
using namespace std;

int main() {
    deque<int> deq = { 85, 87, 88, 89, 90 };

    // 末尾に91を挿入
    deq.emplace_back(91);

    cout << "New Deque: ";
    for (auto x = deq.begin(); x != deq.end(); ++x)
        cout << *x << " ";

    return 0;
}

出力結果

出力 - New Deque: 85 87 88 89 90 91

まとめ

emplace_front()はdequeの先頭に、emplace_back()は末尾に新しい要素を直接構築して追加する関数です。push_front()push_back()との主な違いは、要素をコンテナ内で直接構築できる点にあり、特にコピーコストの大きいオブジェクトを扱う場合にパフォーマンス面で有利になります。両端への柔軟な要素追加が必要な場面で、ぜひ活用してみてください。

  1. C++ STLのforward_list::emplace_after()とemplace_front()の使い方を徹底解説

    本記事では、C++におけるforward_list::emplace_after()とforward_list::emplace_front()関数の動作について詳しく解説します。 forward_listは、前後双方向に走査できる通常のリスト(std::list)とは異なり、次の要素とのリンクのみを保持する片方向リンクリストです。そのため前方方向にしかイテレーションできませんが、その分メモリ効率に優れています。 forward_list::emplace_after()とforward_list::emplace_front()はC++標準ライブラリの一部であり、利用するには<forw

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

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