浅谈STL链表及手写链表
介绍
链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳。
优点
链表的优点还是非常明显的:
- 它可以迅速地在任何节点进行插入和删除操作,因为
list的每个节点保存着它在链表中的位置,插入或删除个元素仅对最多三个元素有所影响。
缺点
list随机检索的性能非常的不好,因为它不像vector那样直接找到元素的地址,而是要从头一个一个的顺序查找。list支持双向迭代器,没有下标,必须使用迭代器遍历list。(由于不支持随机迭代器,不能写迭代器+x,迭代器-x,不能用sort函数,但list拥有sort成员函数)。
STL 链表
个人认为 STL链表 非常适合使用,就比如你喜欢使用 string 而不是 char[] 。但是它一部分功能实际上并没有手写链表好用,比如需要 STL迭代器 遍历等等。
成员函数描述
常用成员函数
| 函数名 | 函数说明 |
|---|---|
push_back(元素) |
往链表尾部添加元素 |
push_front(元素) |
往链表头部添加元素 |
pop_back(元素) |
链表尾部移除元素 |
pop_front(元素) |
链表头部移除元素 |
insert() |
在指定位置插入一个或多个元素 |
begin() |
获取链表的起始地址 |
end() |
获取链表的结束地址 |
size() |
返回链表的结束地址 |
erase(开始地址,结束地址) |
删除链表中置顶范围之间的元素 |
remove(值val) |
删除和 val 相等的元素 |
sort(链表对象) |
链表元素排序 |
clear() |
清空链表 |
empty() |
判断链表是否为空 |
reverse(开始地址,结束地址) |
翻转链表所有值 |
swap() |
交换两个 list |
max_size() |
获取链表支持的最大容量 |
全部成员函数
由 必应AI 为我们整理的全部成员函数以及其解释
根据网络搜索结果¹²³⁴,C++ stl list的所有成员函数及其解释如下表所示:
| 成员函数 | 解释 |
|---|---|
| 构造函数 | 用于创建list对象,可以指定元素个数、值、迭代器范围或初始化列表 |
| begin() | 返回指向list第一个元素的迭代器 |
| end() | 返回指向list最后一个元素之后的迭代器 |
| rbegin() | 返回指向list最后一个元素的反向迭代器 |
| rend() | 返回指向list第一个元素之前的反向迭代器 |
| cbegin() | 返回指向list第一个元素的常量迭代器 |
| cend() | 返回指向list最后一个元素之后的常量迭代器 |
| crbegin() | 返回指向list最后一个元素的常量反向迭代器 |
| crend() | 返回指向list第一个元素之前的常量反向迭代器 |
| size() | 返回list中的元素个数 |
| max_size() | 返回list能容纳的最大元素个数 |
| resize() | 改变list的大小,如果需要,添加或删除元素 |
| empty() | 判断list是否为空 |
| front() | 返回list第一个元素的引用 |
| back() | 返回list最后一个元素的引用 |
| assign() | 用指定的值、迭代器范围或初始化列表替换list中的元素 |
| push_front() | 在list的开头插入一个元素 |
| pop_front() | 删除list的第一个元素 |
| push_back() | 在list的末尾插入一个元素 |
| pop_back() | 删除list的最后一个元素 |
| insert() | 在list的指定位置插入一个或多个元素 |
| erase() | 删除list的指定位置或范围的元素 |
| swap() | 交换两个list的内容 |
| clear() | 删除list中的所有元素 |
| emplace() | 在list的指定位置构造一个元素 |
| emplace_front() | 在list的开头构造一个元素 |
| emplace_back() | 在list的末尾构造一个元素 |
| splice() | 将另一个list或其子序列移动到list的指定位置 |
| remove() | 删除list中等于指定值的所有元素 |
| remove_if() | 删除list中满足指定条件的所有元素 |
| unique() | 删除list中相邻的重复元素 |
| merge() | 将另一个list合并到list中,保持元素的排序 |
| sort() | 对list中的元素进行排序 |
| reverse() | 反转list中的元素的顺序 |
源: 与必应的对话, 2023/2/16(1) C++ List | Top 6 Functions of List in C++ You Should Learn - EDUCBA. https://www.educba.com/c-plus-plus-list/#:~:text=Functions of the List in C%2B%2B 1 1.,5 5. Modifiers ... 6 6. Operations 访问时间 2023/2/16.
(2) std::list - cppreference.com. https://en.cppreference.com/w/cpp/container/list 访问时间 2023/2/16.
(3) list - C++ Reference - cplusplus.com. https://cplusplus.com/reference/list/list/ 访问时间 2023/2/16.
(4) List in C++ Standard Template Library (STL) - GeeksforGeeks. https://www.geeksforgeeks.org/list-cpp-stl/ 访问时间 2023/2/16.
示例代码
1 | // 引入头文件 |
编译结果:
1 | 链表的大小是: 6 |
不错,其实 STL 链表非常容易运用,只需使用成员函数即可。接下来就让我详细地讲解一下手写函数把~