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

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

本記事では、C++標準テンプレートライブラリ(STL)におけるlist::end()関数の動作、構文、そして具体的なコード例について詳しく解説します。

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

リストは、シーケンス内の任意の位置に対して定数時間での挿入・削除を可能にするデータ構造です。内部実装は双方向連結リストになっており、メモリ上の連続しない領域に要素を配置できます。

配列、vector、dequeといったコンテナと比較すると、リストはコンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。その一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。

なお、listはforward_listとよく似ていますが、forward_listは単方向連結リストであり、前方方向にしか走査できないという違いがあります。

list::end()とは?

list::end()は、C++ STLに標準で組み込まれている関数で、<list>ヘッダーファイル内で宣言されています。

end()は、リストコンテナの「末尾要素の次の位置」を指すイテレータを返します。つまり、このイテレータが指すのはコンテナ内の実際のどの要素でもありません。これは「過去終端イテレータ」と呼ばれる特殊な位置です。

この関数は主にlist::begin()と組み合わせて使用され、リストコンテナ全体の範囲を表すために活用されます。

構文

list_container.end();

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

戻り値

リストコンテナの末尾要素の次の位置(past-to-end)を指すイテレータを返します。

注意: end()が返すイテレータを逆参照(デリファレンス)した場合の動作は未定義です。あくまでループの終了条件などに使用するためのものです。

使用例1:end()を使ったリストの走査

以下のコードでは、end()関数を利用してリスト内のすべての要素を順番に出力しています。

#include <bits/stdc++.h>
using namespace std;
int main(){
    // リストを作成
    list<int> myList;
    // push_back()関数で要素を挿入
    myList.push_back(67);
    myList.push_back(12);
    myList.push_back(32);
    myList.push_back(780);
    myList.push_back(78);
    cout<<"elements in the list are :\n";
    // begin()からend()までイテレータで走査
    for (auto j = myList.begin(); j != myList.end(); j++){
        cout << *j << " ";
    }
    return 0;
}

出力

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

Elements in the list are:
67 12 32 780 78

使用例2:配列の値からリストを作成してアクセス

次のコードでは、ヘッダーファイルを明示的にインクルードし、end()関数を使ってリスト内の要素にアクセスしています。

#include <iostream>
#include <list>
int main (){
    // 要素の配列を作成
    int values[] = {67, 12, 32, 780, 78};
    // 配列の値をリストに挿入
    std::list<int> myList (values, values+5);
    std::cout << "elements in the list are :\n";
    // end()が返すイテレータを使ってリスト要素にアクセス
    for (std::list<int>::iterator i = myList.begin(); i != myList.end(); ++i)
        std::cout << ' ' << *i;
    return 0;
}

出力

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

Elements in the list are:
67 12 32 780 78

まとめ

list::end()は、リストの末尾の次の位置を指す重要なイテレータ取得関数です。begin()と組み合わせることで、range-based forループが登場する前から広く使われてきた、リスト走査の基本的なパターンを構成できます。要素の追加・削除が高速なlistの特性を活かしながら、end()を正しく理解して安全に活用しましょう。

  1. C++ STLのlist::reverse()関数の使い方と実例解説

    本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar

  2. C++STLのlist back()関数の使い方を解説

    C++のlist back()関数とは本記事では、C++におけるlist back()関数の動作について詳しく解説します。list::back()関数は、C++標準テンプレートライブラリ(STL)の一部であり、リストの最後(末尾)の要素を取得・表示するために使用されます。この関数を呼び出す前に、必ず<list>ヘッダーファイルをインクルードする必要がある点に注意してください。構文List_Name.back();パラメータこの関数は、いかなるパラメータも受け取りません。戻り値この関数は、リストの最後の要素の値を返します。なお、リストが空の場合の動作は未定義となるため、呼び出し前にリ