
【STL】顺序容器之list、forward_list用法总结
C++容器的
发布日期:2021-05-08 01:38:05
浏览次数:26
分类:精选文章
本文共 3255 字,大约阅读时间需要 10 分钟。
C++容器的list
和forward_list
详解
一、基本原理
list
和forward_list
是C++中常用的链表容器,前者是双向链表,后者是单向链表。两者的核心特点是支持快速的元素插入和删除操作,但缺少随机访问的高效性,访问元素时需要遍历链表。
list
的特点
- 双向链表:支持正向和逆向遍历。
- 性能优化:在新标准中,
forward_list
的性能与手写链表相当,避免了额外开销。 - 无size方法:
forward_list
不支持size()
方法,因为计算大小会增加开销。
forward_list
的特点
- 单向链表:只能正向遍历,无法逆向。
- 高性能:与
forward_list
的性能接近手写链表。
二、使用方法
初始化
使用list
和forward_list
前,需包含相应的头文件:
#include#include
并在代码中使用using namespace std;
命名空间。
初始化示例
容器类型 | 初始化方式 | 示例 |
---|---|---|
list<int> | list<int> li1; | list<int> li1; |
list<int> | list<int> li1(100, 7); | list<int> li1(100, 7); |
list<int> | list<int> li1 = {1, 2, 3, ...}; | list<int> li1 = {1, 2, 3, ...}; |
list<int> | list<int> li2(li1); | list<int> li2(li1); |
容器类型 | 初始化方式 | 示例 |
---|---|---|
forward_list<int> | forward_list<int> f1; | forward_list<int> f1; |
forward_list<int> | forward_list<int> f1(100, 7); | forward_list<int> f1(100, 7); |
forward_list<int> | forward_list<int> f1 = {1, 2, 3, ...}; | forward_list<int> f1 = {1, 2, 3, ...}; |
三、操作方法
访问元素
list
支持正向和逆向访问,forward_list
仅支持正向。
操作 | 示例 | 说明 |
---|---|---|
首元素 | li1.front(); | 获取双向链表首元素 |
尾元素 | li1.back(); | 获取双向链表尾元素 |
迭代器获取 | auto iter = li1.begin(); iter != li1.end(); | 获取正向迭代器 |
逆向迭代器 | auto riter = li1.rbegin(); riter != li1.rend(); | 获取逆向迭代器 |
常量迭代器 | auto citer = li1.cbegin(); citer != li1.cend(); | 获取常量迭代器 |
操作 | 示例 | 说明 |
---|---|---|
首元素 | f1.front(); | 获取单向链表首元素 |
迭代器获取 | auto iter = f1.begin(); iter != f1.end(); | 获取正向迭代器 |
插入元素
list
方法 | 示例 | 说明 |
---|---|---|
push_front | li1.push_front(a); | 在链首添加元素a |
emplace_front | li1.emplace_front(a); | 在链首插入元素a |
push_back | li1.push_back(a); | 在链尾添加元素a |
emplace_back | li1.emplace_back(a); | 在链尾插入元素a |
insert | li1.insert(iter, a); | 在指定位置插入元素a |
insert | li1.insert(iter, n, a); | 在指定位置插入n个元素a |
insert | li1.insert(iter, {a, b, c}); | 在指定位置插入多个元素集合 |
forward_list
方法 | 示例 | 说明 |
---|---|---|
push_front | f1.push_front(a); | 在链首添加元素a |
emplace_front | f1.emplace_front(a); | 在链首插入元素a |
emplace_after | f1.emplace_after(iter, a); | 在指定位置插入元素a |
insert_after | f1.insert_after(iter, a); | 在指定位置插入元素a |
insert_after | f1.insert_after(iter, n, a); | 在指定位置插入n个元素a |
insert_after | f1.insert_after(iter, {a, b, c}); | 在指定位置插入多个元素集合 |
删除元素
list
方法 | 示例 | 说明 |
---|---|---|
pop_front | li1.pop_front(); | 删除链首元素 |
pop_back | li1.pop_back(); | 删除链尾元素 |
erase | li1.erase(iter); | 删除指定位置的元素 |
erase | li1.erase(iter1, iter2); | 删除指定范围内的元素 |
clear | li1.clear(); | 删除所有元素 |
forward_list
方法 | 示例 | 说明 |
---|---|---|
pop_front | f1.pop_front(); | 删除链首元素 |
erase_after | f1.erase_after(iter); | 删除指定位置的元素 |
erase_after | f1.erase_after(iter1, iter2); | 删除指定范围内的元素 |
clear | f1.clear(); | 删除所有元素 |
四、替换元素
list
方法 | 示例 | 说明 |
---|---|---|
swap | li1.swap(li2); | 交换两个list 的元素 |
assign | li1.assign(iter1, iter2); | 替换为指定范围内的元素集合 |
assign | li1.assign({1, 2, 3, ...}); | 替换为初始化列表中的元素 |
assign | li1.assign(7, 1); | 替换为指定数量的元素值 |
forward_list
方法 | 示例 | 说明 |
---|---|---|
swap | f1.swap(f2); | 交换两个forward_list 的元素 |
assign | f1.assign(iter1, iter2); | 替换为指定范围内的元素集合 |
assign | f1.assign({1, 2, 3, ...}); | 替换为初始化列表中的元素 |
assign | f1.assign(7, 1); | 替换为指定数量的元素值 |
五、容器大小
list
方法 | 示例 | 说明 |
---|---|---|
size() | li1.size(); | 获取元素数量 |
empty() | li1.empty(); | 检查是否为空 |
maxsize() | li1.maxsize(); | 获取最大可存储元素数目 |
resize(n) | li1.resize(n); | 调整大小到指定数量 |
resize(n, T) | li1.resize(n, T); | 调整大小到指定数量,新元素初始化为T |
forward_list
方法 | 示例 | 说明 |
---|---|---|
size() | f1.size(); | 获取元素数量 |
empty() | f1.empty(); | 检查是否为空 |
maxsize() | f1.maxsize(); | 获取最大可存储元素数目 |
resize(n) | f1.resize(n); | 调整大小到指定数量 |
resize(n, T) | f1.resize(n, T); | 调整大小到指定数量,新元素初始化为T |
六、查找与操作
使用标准库算法(如find
、replace
、sort
、unique
、accumulate
等)进行高级操作。
七、注意事项
- 迭代器有效性:插入或删除元素可能使迭代器失效,需谨慎操作。
- 容器类型影响:不同容器对迭代器的影响不同,需根据容器选择合适的操作。
通过以上方法,list
和forward_list
为C++程序提供了灵活且高效的链表操作。选择合适的容器类型根据具体需求来决定,以达到最佳性能和代码简洁性。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月26日 09时02分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
c++之程序流程控制
2019-03-06
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2019-03-06
李笑来必读书籍整理
2019-03-06
Hadoop(十六)之使用Combiner优化MapReduce
2019-03-06
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2019-03-06
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2019-03-06
C语言编译错误列表
2019-03-07
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
python中列表 元组 字典 集合的区别
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07