0

0

c++的std::forward_list是什么 单向链表容器的使用【STL详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-19 11:32:02

|

609人浏览过

|

来源于php中文网

原创

std::forward_list 是 C++11 引入的单向无哨兵链表,内存更紧凑、头部操作高效,但不支持随机访问、反向迭代和 O(1) size()(C++17 起可选),适用于内存敏感、头部频繁增删且单向遍历的场景。

c++的std::forward_list是什么 单向链表容器的使用【stl详解】

std::forward_list 是 C++11 引入的标准模板库(STL)容器,它是一个不带尾指针的单向链表,只支持从头到尾的单向遍历,不提供随机访问,也不保存自身大小(size() 在 C++11 中默认是 O(n) 操作,C++17 起可选实现为 O(1),但标准仍不强制)。

为什么用 forward_list 而不是 list?

相比 std::list(双向链表),forward_list 内存更紧凑:每个节点只存一个指针(指向下一节点),没有 prev 指针,也没有额外的哨兵节点(sentinel node)。这意味着:

  • 每个元素内存开销更小(尤其对小对象,如 intchar*
  • 插入/删除操作在已知位置时,性能略优(少一次指针更新)
  • 但不支持反向迭代、无法直接获取长度、不能通过下标访问

基本用法与常见操作

声明和初始化:

  std::forward_list fl = {1, 2, 3};
  std::forward_list<:string> names;
  fl.push_front(0); // 只能从前端插入

立即学习C++免费学习笔记(深入)”;

关键限制与对应操作:

绘蛙
绘蛙

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载
  • 没有 push_back() —— 需用 insert_after() 在末尾前插入,或遍历到末尾再插
  • 没有 pop_back() —— 删除末尾需先找到倒数第二个节点,再 erase_after()
  • 所有修改操作都围绕 before 位置:如 insert_after(it, val)erase_after(it)
  • 迭代器是单向的:forward_list::iterator 只支持 ++,不支持 -- 或 +n

实用技巧:高效插入与拼接

因为没有尾指针,手动维护尾迭代器可避免重复遍历:

  std::forward_list a = {1, 2};
  auto tail = std::prev(a.end()); // C++11 起可用 prev,但注意 forward_list::end() 不可递减
  // 更安全做法:用 before_begin()
  a.insert_after(tail, 3); // 插入到末尾

拼接两个 forward_list 推荐用 splice_after()

  • a.splice_after(pos, b):把 b 的所有元素插入到 a 中 pos 后面,b 变为空
  • O(1) 时间,不复制元素,比循环 insert_after 高效得多

什么时候该选 forward_list?

适用场景很明确:

  • 频繁在头部插入/删除,且极少需要随机访问或反向遍历
  • 内存敏感环境(嵌入式、高频小对象缓存),且容器平均长度不长
  • 算法逻辑天然符合单向流式处理(如解析 token 链、事件队列、LRU 前半段)

不推荐用于:需要 size()、需要 back()、需要稳定下标、或常做尾部操作的场景——此时 vectorlist 更合适。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

381

2023.08.02

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6110

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

816

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1064

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1296

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

381

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.3万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.8万人学习

Vue 教程
Vue 教程

共42课时 | 7.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号