列表
Coddy C++ 标准模板库 课程的第 7 课,共 23 课。
List 是 C++ 内置的序列容器,支持非连续内存分配。我们说到 list 时,指的是双向链表。还有另一种叫作 forward list 的列表,指的是单向链表。
下面来澄清一下。
vector 数据结构支持连续内存分配,也就是说,每个元素在内存中都紧跟在前一个元素之后。
而链表 数据结构中的元素包含数据部分(实际值)和一个指针,指针中存储着列表中下一个元素的内存地址。
C++ 中有两种链表:
- 双向链表 ,
list - 单向链表 ,
forward list
双向链表 和单向链表的主要区别是,单向链表只能向前遍历,也就是说,每个元素都有自己的值和下一个元素的内存地址。而双向链表 中的元素会保存定位列表中下一个元素和前一个元素所需的信息。
我们可以通过在文件中引入 list(双向链表)和 forward list(单向链表)来使用它们:
#include <list>
#include <forward_list>或者,我们也可以只引入 bits/stdc++.h 头文件。
Forward List
首先,我们来介绍 forward list。它有很多方法,下面介绍其中最实用的几个。
声明 forward list 的方式和声明 vector 及 deque 完全一样。
forward_list<int> flist = {1, 2, 3};我们可以使用 push_front() 方法添加元素,也可以使用 pop_front() 从头部移除元素。
flist.push_front(5);
for (int &x : flist) // 我们用每次迭代都会递增的指针输出元素
cout << x << " ";
cout << endl;
flist.pop_front();
for (int &x : flist)
cout << x << " ";Output:
5 1 2 3
1 2 3Forward List 方法
| 方法 | 功能 |
| insert_after() | 在指定位置之后插入元素 |
| remove() | 移除指定元素 |
| assign() | 用于将指定内容赋给列表。也可以只使用两个整数,这表示将指定元素赋值 n 次 |
List
接下来是 list。list 数据结构也有很多方法,下面会介绍其中最实用的几个。
首先,你将学习如何在 .cpp 文件顶部引入相关内容后声明 list 。
list<int> list1 = {1, 2, 3};我们可以使用 push_front() 或 push_back() 方法向列表中添加元素。
同样,我们可以分别使用 pop_front() 和 pop_back() 方法移除第一个和最后一个元素。
list1.push_back(4);
list1.push_front(0);
for (int &x : list1)
cout << x << " ";
cout << endl;
list1.pop_front();
list1.pop_back();
for (int &x : list1)
cout << x << " ";Output:
0 1 2 3 4
1 2 3List 方法
| 方法 | 功能 |
| front() | 返回列表中第一个元素的值 |
| back() | 返回列表中最后一个元素的值 |
| empty() | 返回列表是否为空,是则返回 1,否则返回 0 |
| erase() | 移除列表中的单个元素或一段范围内的元素 |
| remove() | 从列表中移除所有元素 |
亲手试试
这节课没有代码挑战。
C++ 标准模板库中的所有课
自己练习: C++ 在线编译器