C++ std::list 用法與範例

本篇 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 用法與範例