本篇 ShengYu 將介紹 C++ std::list 用法與範例,C++ std::list 是一個 double linked list 實作的容器,C++ STL 另外有提供 single linked list 叫做 std::forward_list,list 和 vector 不同的是 list 不支援隨機存取的功能,list 的插入移除操作是常數時間,

以下 C++ list 用法與範例將分為這幾部分,

  • list 常用功能
  • list 初始化
  • list 在尾部新增元素
  • list 在頭部新增元素
  • list for 迴圈遍歷
  • 要使用 list 容器的話, 需要引入的標頭檔 <list>

    list 常用功能

    以下為 std::list 內常用的成員函式,
    修改器
    push_back :把一個元素添加到尾端
    push_front :把一個元素插入到頭端
    pop_back :移除最後一個元素(尾端)
    pop_front :移除第一個元素(頭端)
    insert :插入元素
    erase :移除某個位置元素, 也可以移除某一段範圍的元素
    clear :清空容器裡所有元素
    容量
    empty :回傳是否為空
    size :回傳目前長度
    元素存取
    front :取得頭部元素
    back :取得尾部元素
    迭代器
    begin :回傳指向第一個元素(頭端)的迭代器
    cbegin :回傳指向第一個元素(頭端)的迭代器(const)
    end :回傳指向最後一個元素(尾端)的迭代器
    cend :回傳指向最後一個元素(尾端)的迭代器(const)
    rbegin :回傳指向最後一個元素(尾端)的反向迭代器
    crbegin :回傳指向最後一個元素(尾端)的反向迭代器(const)
    rend :回傳指向第一個元素(頭端)的反向迭代器
    crend :回傳指向第一個元素(頭端)的反向迭代器(const)

    list 初始化

    C++ std::list 初始化的寫法如下,

    1
    2
    3
    4
    5
    6
    7
    8
    #include <list>
    using namespace std;

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

    return 0;
    }

    另外一種初始化 list 的方式是根據 C-Style 傳統陣列來 list 初始元素,

    1
    2
    int array[] = {3, 2, 1};
    std::list<int> myList(array, array+3);

    如果要根據另一個 list 來初始 list 的方法有兩種,一種是使用 = operator,另一種是使用 assign() ,使用 = operator 的好處是簡單方便,使用 assign() 的好處是還可以指定要複製範圍,

    1
    2
    3
    4
    5
    std::list<int> myList1 = {1, 2, 3, 4, 5};
    std::list<int> myList2;
    myList2 = myList1;
    // 或者用 assign()
    myList2.assign(myList1.begin(), myList1.end());

    要初始化 5 個 10 的話可以這樣寫,

    1
    std::list<int> myList(5, 10);

    list 在尾部新增元素

    在 list 尾部新增元素的寫法如下,

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

    list 在頭部新增元素

    在 list 頭部新增元素的寫法如下,

    1
    2
    std::list<int> myList = {1, 2, 3};
    myList.push_front(0);

    list for 迴圈遍歷

    for 迴圈遍歷 list 的方式有幾種,
    首先介紹用 range-based for loop 遍歷 list 並且把元素印出來,寫法如下,

    1
    2
    3
    4
    5
    std::list<int> myList = {1, 2, 3};
    for (int n : myList) {
    std::cout << n << ", ";
    }
    std::cout << "\n";

    使用 for 迴圈搭配迭代器 iterator,寫法如下,

    1
    2
    3
    4
    5
    6
    // for (auto it = myList.begin(); it != myList.end(); it++) {
    // or
    for (std::list<int>::iterator it = myList.begin(); it != myList.end(); it++) {
    std::cout << *it << ", ";
    }
    std::cout << "\n";

    上述是正向迭代器的範例,輸出結果會從 list 頭部印到尾部,
    如果要倒過來印,從 list 尾部印到頭部的話,可以使用反向迭代器 reverse_iterator,

    1
    2
    3
    4
    5
    6
    // for (auto it = myList.rbegin(); it != myList.rend(); it++) {
    // or
    for (std::list<int>::reverse_iterator it = myList.rbegin(); it != myList.rend(); it++) {
    std::cout << *it << ", ";
    }
    std::cout << "\n";

    參考
    [1] std::list - cppreference.com
    https://en.cppreference.com/w/cpp/container/list
    [2] list - C++ Reference
    http://www.cplusplus.com/reference/list/list/

    其它相關文章推薦
    如果你想學習 C++ 相關技術,可以參考看看下面的文章,
    C/C++ 新手入門教學懶人包
    std::vector 用法與範例
    std::deque 用法與範例
    std::queue 用法與範例
    std::stack 用法與範例
    std::set 用法與範例
    std::map 用法與範例
    std::unordered_map 用法與範例