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

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

本記事では、C++ STLで提供されているlist::pop_front()およびlist::pop_back()関数について、その動作原理・構文・具体的な使用例をわかりやすく解説します。

STLにおけるlist(リスト)とは?

listは、シーケンス内の任意の位置に対して定数時間での挿入と削除を可能にするデータ構造です。内部的には双方向連結リスト(doubly linked list)として実装されており、メモリ上に連続した領域を確保しない「非連続なメモリ割り当て」が特徴です。

配列(array)、vector、dequeと比較すると、listはコンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという欠点があります。また、listはforward_listと似ていますが、forward_listは単方向連結リストであり、前方方向にしかイテレートできない点が異なります。

list::pop_front()とは?

list::pop_front()は、C++ STLに組み込まれている関数で、<list>ヘッダーファイル内で宣言されています。この関数は、リストコンテナの先頭にある要素を削除(pop)するために使用されます。

pop_front()を呼び出すと、コンテナの最初の要素が削除され、2番目だった要素が新しい先頭要素になります。同時に、コンテナのサイズは1減少します。

構文

list_container1.pop_front();

引数(パラメータ)

この関数は引数を受け取りません。

戻り値

この関数は何も返しません(void型)。

使用例

Input: list<int> List_container = {10, 11, 13, 15};
      List_container.pop_front();
Output:
      List = 11 13 15

サンプルコード

#include <iostream>
#include <list>
using namespace std;
int main(){
    list<int> myList_1 = {}, myList_2 = {};
    myList_1.push_front(10);
    myList_1.push_front(20);
    myList_1.push_front(30);
    myList_1.push_front(40);
    myList_1.push_front(50);
    while (!myList_1.empty()){
        myList_2.push_front(myList_1.front());
        myList_1.pop_front();
    }
    cout<<"Elements in the list are : ";
    for (auto i = myList_2.begin(); i!= myList_2.end(); ++i)
        cout << ' ' << *i;
}

実行結果

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

Elements in the list are : 10 20 30 40 50

この例では、myList_1の先頭から順に要素を取り出し(front()で参照し、pop_front()で削除し)、myList_2の先頭に挿入しています。その結果、元の順序を保ったまま要素がコピーされます。

list::pop_back()とは?

list::pop_back()も、C++ STLに組み込まれている関数で、<list>ヘッダーファイル内で宣言されています。この関数は、リストコンテナの末尾(最後)にある要素を削除(pop)するために使用されます。

pop_back()を呼び出すと、最後の要素が削除され、その直前の要素が新しい末尾要素になります。そして、リストコンテナのサイズは1減少します。

構文

list_container.pop_back();

引数(パラメータ)

この関数は引数を受け取りません。

戻り値

この関数は何も返しません(void型)。

使用例

Input: list<int> List_container = {10, 11, 13, 15};
      List_container.pop_back();
Output:
      List = 10 11 13

サンプルコード

#include <iostream>
#include <list>
using namespace std;
int main(){
    list<int> myList_1 = {}, myList_2 = {};
    myList_1.push_front(10);
    myList_1.push_front(20);
    myList_1.push_front(30);
    myList_1.push_front(40);
    myList_1.push_front(50);
    while (!myList_1.empty()){
        myList_2.push_front(myList_1.back());
        myList_1.pop_back();
    }
    cout<<"Elements in the list are : ";
    for (auto i = myList_2.begin(); i!= myList_2.end(); ++i)
        cout << ' ' << *i;
}

実行結果

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

Elements in the list are : 50 40 30 20 10

この例では、myList_1の末尾から順に要素を取り出し(back()で参照し、pop_back()で削除し)、myList_2の先頭に挿入しています。そのため、出力結果は元のリストの逆順になっています。

まとめ

list::pop_front()とlist::pop_back()は、どちらも引数なし・戻り値なしで、それぞれリストの先頭・末尾の要素を定数時間O(1)で削除できる便利な関数です。なお、空のリストに対してこれらの関数を呼び出す動作は未定義(undefined behavior)となるため、呼び出し前にempty()で空かどうかを確認することが推奨されます。

  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)を返す関数です。このイテレータを使えばリストを走査することはできますが、リスト内の値を変更することはできません