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

C++ STLのlist::emplace_front()とlist::emplace_back()の使い方を徹底解説

本記事では、C++ STLにおける list::emplace_front()list::emplace_back() の動作、構文、具体的な使用例について詳しく解説します。

STLにおけるlistとは?

list(リスト)は、シーケンス内の任意の位置に対して定数時間での挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、非連続的なメモリ割り当てを行います。配列やvector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は低速である点に注意が必要です。また、listはforward_listとよく似ていますが、forward_listは単方向連結リストであり、前方方向にしかイテレートできないという違いがあります。

list::emplace_front()とは?

list::emplace_front()は、<list>ヘッダーで宣言されているC++ STLの組み込み関数です。listコンテナの先頭に要素を直接構築しながら挿入するために使用されます。コンテナが空の場合は、その要素が先頭の要素となり、すでに要素が存在する場合は、渡された要素が先頭に挿入され、従来の先頭要素は2番目に移動します。この関数を呼び出すたびに、コンテナのサイズは1増加します。

構文

listname.emplace_front(const value_type& element1);
listname.emplace_front(value_type&& element1);

パラメータ

この関数は、挿入したい1つの要素のみを受け取ります。

戻り値

この関数には戻り値がありません。

簡単な使用例

入力:list<int> mylist = {1, 2, 3, 4};
mylist.emplace_front(0);

出力:
List elements are = 0 1 2 3 4

サンプルコード

#include <iostream>
#include <list>
using namespace std;

int main(){
    list<int> List;
    List.emplace_front(10);
    List.emplace_front(20);
    List.emplace_front(30);
    List.emplace_front(40);
    List.emplace_front(50);
    List.emplace_front(60);

    cout<<"Elements are : ";
    for(auto i = List.begin(); i != List.end(); ++i)
        cout << ' ' << *i;

    return 0;
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Elements are : 60 50 40 30 20 10

emplace_front()は毎回先頭に要素を追加するため、挿入した順序とは逆順(60から10)に出力される点に注目してください。

list::emplace_back()とは?

list::emplace_back()も、<list>ヘッダーで宣言されているC++ STLの組み込み関数です。listコンテナの末尾に要素を直接構築しながら挿入するために使用されます。コンテナが空の場合は単純に要素が挿入されてサイズが1になり、すでに要素が存在する場合は、渡された要素がlistコンテナの末尾に追加されます。この関数を呼び出すたびに、コンテナのサイズは1増加します。

構文

listname.emplace_back(const value_type& element1);
listname.emplace_back(value_type&& element1);

パラメータ

この関数は、挿入したい1つの要素のみを受け取ります。

戻り値

この関数には戻り値がありません。

簡単な使用例

入力:list<int> list1 = {1, 2, 3, 4};
      list1.emplace_back(5);

出力:List: 1 2 3 4 5

サンプルコード

#include <iostream>
#include <list>
using namespace std;

int main(){
    list<int> List;
    List.emplace_back(10);
    List.emplace_back(20);
    List.emplace_back(30);
    List.emplace_back(40);
    List.emplace_back(50);
    List.emplace_back(60);

    cout<<"elements are : ";
    for(auto i = List.begin(); i != List.end(); ++i)
        cout << ' ' << *i;

    return 0;
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Elements are : 10 20 30 40 50 60

まとめ

emplace_front()はリストの先頭に、emplace_back()はリストの末尾に要素を追加する関数です。どちらも戻り値を持たず、呼び出しのたびにコンテナのサイズが1増加します。push_front()やpush_back()との主な違いは、emplace系の関数は既存オブジェクトをコピーせず、渡した引数からコンテナ内で直接オブジェクトを構築できる点にあります。そのため、大きなオブジェクトやコピーのコストが高い型を扱う場合に、パフォーマンス面で有利になります。

  1. C++ STLのlistにおけるcrbegin()・crend()関数の使い方を解説

    C++のSTL(標準テンプレートライブラリ)には、リストを逆方向に走査するための便利なメンバ関数が用意されています。本記事では、list::crbegin()とlist::crend()の2つの関数の動作について詳しく解説します。これらの関数はC++標準テンプレートライブラリの一部であり、使用するには<list>ヘッダーをインクルードする必要があります。list::crbegin()とはlist::crbegin()は、リストの逆先頭(つまりリストの末尾要素)を指す定数リバースイテレータを返します。この関数を使うと、リストを末尾から先頭へ向かって辿ることができますが、イテレータを通

  2. C++ STLのlist::cbegin()とcend()関数の使い方を解説

    本記事では、C++におけるlist::cbegin()およびlist::cend()関数の動作について解説します。list::cbegin()とlist::cend()は、C++標準テンプレートライブラリ(STL)の一部として提供されているメンバ関数です。これらの関数を呼び出すには、ヘッダーファイル<list>をインクルードする必要があります。list::cbegin()とはlist::cbegin()は、リストの先頭要素を指す定数イテレータ(const_iterator)を返す関数です。このイテレータを使えばリストを走査することはできますが、リスト内の値を変更することはできません