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

C++ STLのforward_list::clear()とforward_list::erase_after()の使い方を徹底解説

本記事では、C++ STLにおけるforward_list::clear()およびforward_list::erase_after()関数の動作、構文、具体的な使用例について詳しく解説します。これらの関数を使いこなせるようになると、単方向リンクリストの要素管理を効率的に行えるようになります。

STLにおけるforward_listとは?

forward_listはシーケンスコンテナの一種で、シーケンス内の任意の位置に対して定数時間(O(1))での挿入・削除操作を行えるのが特徴です。forward_listは単方向リンクリストとして実装されており、各要素が次の要素へのリンクを持つことで、シーケンスの順序が維持されます。

双方向リンクリストであるstd::listと比べてメモリ消費が少ない一方、前方へのみ走査できるという制約があります。そのため、要素の削除方法も通常のコンテナとは少し異なります。

forward_list::clear()とは?

forward_list::clear()はC++ STLに組み込まれた関数で、<forward_list>ヘッダーファイルで宣言されています。clear()は、forward listのすべての要素を一括で削除したい場合に使用します。この関数を呼び出すと、リスト内の全要素が破棄され、リストのサイズは0になります。

構文

flist_container1.clear();

パラメータ

この関数はパラメータを受け取りません。

戻り値

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

使用例

入力: forward_list<int> forward = {1, 2, 3, 4};
      forward.clear();
      forward.size();
出力: 0

サンプルコード

#include <forward_list>
#include <iostream>
using namespace std;
int main(){
    forward_list<int> myList = { 10, 20, 30, 40 };
    myList.clear();
    for (auto i = myList.begin(); i != myList.end(); ++i)
        cout << ' ' << *i;
    cout << "List is cleared";
    return 0;
}

出力結果

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

List is cleared

clear()呼び出し後はすべての要素が削除されているため、ループによる要素の出力は何も表示せず、「List is cleared」というメッセージのみが出力されます。

forward_list::erase_after()とは?

forward_list::erase_after()もC++ STLに組み込まれた関数で、<forward_list>ヘッダーファイルで宣言されています。erase_after()は、指定した位置の「次」にある要素を削除したい場合に使用します。これは、単方向リンクリストでは前のノードを辿れないため、削除対象の一つ手前の位置を指定する仕様になっているからです。削除された要素の数だけ、forward listのサイズが減少します。

構文

flist_container1.erase_after(unsigned int position);

パラメータ

この関数は1つのパラメータを受け取ります。これは、要素を削除する基準となる位置(イテレータまたは位置インデックス)です。指定した位置の直後にある要素が削除されます。

戻り値

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

使用例

入力: forward_list<int> forward = {1, 2, 3, 4};
      forward.erase_after(2);
出力:
      erase_after()実行後のforward list = 1 2 3

この例では、位置2(3番目の要素「3」)の次にある要素「4」が削除され、結果として「1 2 3」が残ります。

サンプルコード

#include <forward_list>
#include <iostream>
using namespace std;
int main(){
    forward_list<int> myList = { 10, 20, 30, 40, 50 };
    forward_list<int>::iterator i;
    i = myList.begin();
    myList.erase_after(i);
    cout << "Elements are : ";
    for (auto i = myList.begin(); i != myList.end(); ++i)
        cout << ' ' << *i;
    return 0;
}

出力結果

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

Elements are : 10 30 40 50

このコードでは、イテレータiが先頭要素「10」を指している状態でerase_after(i)を呼び出しているため、その次の要素「20」が削除されます。結果として「10 30 40 50」が出力されます。

まとめ

  • clear(): リスト内の全要素を一度に削除し、サイズを0にする。
  • erase_after(): 指定した位置の次の要素を削除する。単方向リンクリストの特性上、削除対象の一つ手前を指定する点に注意。

どちらの関数も戻り値を持たず、<forward_list>ヘッダーをインクルードすることで利用できます。forward_listを扱う際には、これらの関数の動作の違いを正しく理解しておくことが重要です。

  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のforward_list::cend()関数の使い方を徹底解説

    C++標準テンプレートライブラリ(STL)のforward_list::cend()関数の働きについて解説します。 通常のlistは前後両方向の要素へのリンクを保持しているため双方向の走査が可能ですが、forward_listは次の要素へのリンクのみを保持しており、前方方向にしか走査できません。 forward_list::cend()はC++標準テンプレートライブラリの一部であり、リストの末尾要素の直後(過去末尾)を指す定数イテレータを取得するために使用されます。このイテレータは実際の要素を指すものではなく、走査範囲の終端を示すマーカーとして機能します。 この関数を呼び出すには、<fo