【STL】顺序容器之list、forward_list用法总结
发布日期:2021-05-08 01:38:05 浏览次数:26 分类:精选文章

本文共 3255 字,大约阅读时间需要 10 分钟。

C++容器的listforward_list详解

一、基本原理

listforward_list是C++中常用的链表容器,前者是双向链表,后者是单向链表。两者的核心特点是支持快速的元素插入和删除操作,但缺少随机访问的高效性,访问元素时需要遍历链表。

list的特点

  • 双向链表:支持正向和逆向遍历。
  • 性能优化:在新标准中,forward_list的性能与手写链表相当,避免了额外开销。
  • 无size方法forward_list不支持size()方法,因为计算大小会增加开销。

forward_list的特点

  • 单向链表:只能正向遍历,无法逆向。
  • 高性能:与forward_list的性能接近手写链表。

二、使用方法

初始化

使用listforward_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

六、查找与操作

使用标准库算法(如findreplacesortuniqueaccumulate等)进行高级操作。

七、注意事项

  • 迭代器有效性:插入或删除元素可能使迭代器失效,需谨慎操作。
  • 容器类型影响:不同容器对迭代器的影响不同,需根据容器选择合适的操作。

通过以上方法,listforward_list为C++程序提供了灵活且高效的链表操作。选择合适的容器类型根据具体需求来决定,以达到最佳性能和代码简洁性。

上一篇:【STL】顺序容器之string用法总结
下一篇:【STL】顺序容器之vector用法总结

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月26日 09时02分43秒