[C++] STL - リストの使用と導入、リストのコンストラクターとその使用、リスト反復子とその使用

1. リストの導入と利用

  リストの完全な紹介

ここに画像の説明を挿入

(1) リストは一定範囲内の任意の位置に挿入・削除が可能な連続コンテナであり、双方向に反復可能です。

(2) リストの最下層は二重連結リスト構造となっており、二重連結リストの各要素は互いに関連性のない独立したノードに格納され、ポインタは前の要素と次の要素を指します。ノード。

(3) list は forward_list に非常に似ています。主な違いは、forward_list が単一のリンクされたリストであり、前方にのみ反復できるため、より単純かつ効率的であることです。

(4) 他のシリアル コンテナ (配列、ベクトル、デキュー) と比較して、リストは通常​​、任意の位置での要素の挿入および削除の実行効率が優れています。

(5) 他の順次コンテナと比較して、list と forward_list の最大の欠点は、任意の位置でのランダム アクセスをサポートしていないことです。たとえば、リストの6 番目の要素にアクセスするには、既知の位置 (たとえば、 (先頭または末尾) この位置まで反復するには直線的な時間がかかります。リストには、各ノードの関連情報を保持するための追加のスペースも必要です (これは、小さい型の要素を格納する大きなリストでは問題になる可能性があります。重要な要素です)。

ここに画像の説明を挿入
list は主要な双方向循環リンク リストです

2. リストのコンストラクタ

(1)リスト (サイズ型 n, const 値型& val = 値型())

  list クラスは、指定された数の要素を含むリンク リストを作成するために使用されるコンストラクター リスト (size_type n、const value_type& val = value_type()) を提供します。

  n: 作成する要素の数を示します。

  val (オプション): リンクされたリストの各位置に挿入されるデフォルト値を示します。

  このコンストラクターの使用例を次に示します。

#include <iostream>
#include <list>

int main() {
    
    
    // 创建一个包含5个元素的链表,每个元素的值都为100
    std::list<int> myList(5, 100);
    
    // 遍历链表并输出元素
    for (const auto& element : myList) {
    
    
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

//100 100 100 100 100

(2) list() は空のリストを構築します

  リスト クラスは、要素のない空のリンク リストを作成するデフォルトのコンストラクター list() も提供します。

  list のデフォルトのコンストラクター list() は、空のリンク リストを作成するために使用されます。リンク リスト操作関数 (push_back()、push_front() など) を使用してリンク リストに要素を追加し、リンク リストの構築を完了できます。

  以下は list() コンストラクターの使用例です。

#include <iostream>
#include <list>

int main() {
    
    
    // 创建一个空链表
    std::list<int> myList;
    
    // 在链表末尾添加元素
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    // 遍历链表并输出元素
    for (const auto& element : myList) {
    
    
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

//10 20 30

(3) リスト (const list& x)コピーコンストラクタ

  リスト クラスは、指定されたリンク リスト x と同じ要素を含む新しいリンク リストを作成するためのコピー コンストラクター list(const list& x) も提供します。

  list のコピー コンストラクター list(const list& x) は、指定されたリンク リスト x と同じ要素を含む新しいリンク リストを作成するために使用されます。コピー コンストラクターによって作成されたリンク リストは元のリンク リストから独立しており、元のリンク リストへの変更はコピーされたリンク リストには反映されません。

  以下は list(const list& x) コピー コンストラクターの使用例です。

#include <iostream>
#include <list>

int main() {
    
    
    // 创建一个链表
    std::list<int> originalList{
    
    1, 2, 3, 4, 5};
    
    // 使用拷贝构造函数创建另一个链表
    std::list<int> copiedList(originalList);
    
    // 修改原始链表
    originalList.push_back(6);
    
    // 遍历拷贝链表并输出元素
    for (const auto& element : copiedList) {
    
    
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

//1 2 3 4 5

(4)リスト(最初にInputIterator、最後にInputIterator)

  list(InputIterator first, InputIterator last) は、指定された範囲 [first, last) からコピーされた要素を含む新しいリンク リストを作成する std::list の範囲コンストラクターです。

  リスト list(InputIterator first, InputIterator last) の範囲コンストラクターは、指定された範囲 [first, last) から要素がコピーされる新しいリンク リストを作成するために使用されます。範囲は、コンテナのイテレータ範囲、配列ポインタと要素の数などを渡すことによって指定できます。このようにして作成されたリンク リストにはソース範囲と同じ要素が含まれており、これらの要素は新しいリンク リストにコピーされ、個々のノードとデータが再配布されます。

  list(InputIterator first, InputIterator last) 範囲コンストラクターの使用例を次に示します。

#include <iostream>
#include <list>
#include <vector>

int main() {
    
    
    // 创建一个 vector,并初始化其中的元素
    std::vector<int> vec{
    
    1, 2, 3, 4, 5};
    
    // 使用范围构造函数创建一个链表,从 vector 中复制元素
    std::list<int> myList(vec.begin(), vec.end());
    
    // 遍历链表并输出元素
    for (const auto& element : myList) {
    
    
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

//1 2 3 4 5

3. リスト反復子

ここに画像の説明を挿入

(1)始まり+終わり

    list は二重リンク リスト コンテナであり、リンク リストの最初の要素と最後の要素を指す反復子を取得するための begin() 関数と end() 関数を提供します。

  begin() 関数は、リンク リストの最初の要素を指す反復子を返し、end() 関数は、リンク リストの末尾の後の要素を指す反復子を返します。これら 2 つの関数によって返される反復子を使用すると、リンクされたリスト内の要素をループ内で走査できます。

  begin() 関数と end() 関数の定義と使用例を次に示します。

#include <iostream>
#include <list>

int main() {
    
    
    std::list<int> myList = {
    
    1, 2, 3, 4, 5};

    // 使用 begin() 获取链表首元素的迭代器
    std::list<int>::iterator itBegin = myList.begin();

    // 使用 end() 获取链表尾后元素的迭代器
    std::list<int>::iterator itEnd = myList.end();

    // 输出链表中的元素
    for (std::list<int>::iterator it = itBegin; it != itEnd; ++it) {
    
    
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//1 2 3 4 5

(2)開始 + 終了

  list は二重リンク リスト コンテナであり、rbegin() 関数と rend() 関数も提供します。これらの関数は、逆順のリンク リストの最初の要素と、逆順の終了後の要素を指す逆反復子を取得するために使用されます。

  rbegin() 関数は、リンク リストの逆順の最初の要素を指す逆反復子を返し、rend() 関数は、リンク リストの逆順の終了後の要素を指す逆反復子を返します。これら 2 つの関数によって返される逆反復子を使用すると、リンクされたリスト内の要素をループ内で逆の順序で走査できます。

  rbegin() 関数と rend() 関数の定義と使用例を次に示します。

#include <iostream>
#include <list>

int main() {
    
    
    std::list<int> myList = {
    
    1, 2, 3, 4, 5};

    // 使用 rbegin() 获取链表逆序首元素的反向迭代器
    std::list<int>::reverse_iterator itRbegin = myList.rbegin();

    // 使用 rend() 获取链表逆序尾后元素的反向迭代器
    std::list<int>::reverse_iterator itRend = myList.rend();

    // 输出链表中的元素(逆序)
    for (std::list<int>::reverse_iterator it = itRbegin; it != itRend; ++it) {
    
    
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

//5 4 3 2 1

おすすめ

転載: blog.csdn.net/Crocodile1006/article/details/131818869