news 2026/4/15 10:45:52

C++中的forward_list容器详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++中的forward_list容器详解

C++中的forward_list容器详解

1.forward_list概述

forward_list是C++11引入的单向链表容器,相比list更加节省空间,但只支持单向遍历。它是最简单的链表结构,每个元素只包含指向下一个元素的指针。

2. 基本特性

  • 单向链表:每个元素只包含指向下一个元素的指针
  • 高效插入/删除:在已知位置插入/删除是O(1)O(1)O(1)时间复杂度
  • 无随机访问:不支持下标操作和反向遍历
  • 最小内存开销:相比list节省一个指针的空间
  • size()操作:为节省空间不维护大小信息

3. 头文件与声明

#include<forward_list>usingnamespacestd;forward_list<int>flst1;// 空forward_listforward_list<string>flst2(10);// 包含10个默认构造的stringforward_list<double>flst3(5,3.14);// 包含5个3.14forward_list<char>flst4={'a','b','c'};// 初始化列表

4. 构造函数与初始化

4.1 默认构造

forward_list<int>flst;

4.2 填充构造

forward_list<int>flst(10);// 10个默认初始化的int(0)forward_list<int>flst(5,100);// 5个100

4.3 范围构造

intarr[]={1,2,3};forward_list<int>flst(arr,arr+3);

4.4 拷贝构造

forward_list<int>flst2(flst1);

5. 容量操作

5.1empty()

if(flst.empty()){cout<<"Forward_list is empty";}

5.2max_size()

cout<<flst.max_size();// 返回forward_list可容纳的最大元素数

6. 元素访问

6.1front()

flst.front()=5;// 修改第一个元素intfirst=flst.front();// 访问第一个元素

7. 修改操作

7.1push_front()

flst.push_front(5);// 在头部插入5

7.2pop_front()

flst.pop_front();// 删除头部元素

7.3insert_after()

autoit=flst.insert_after(flst.before_begin(),15);// 在头部插入15flst.insert_after(it,{1,2,3});// 在指定位置后插入多个元素

7.4erase_after()

flst.erase_after(flst.before_begin());// 删除第一个元素flst.erase_after(it,flst.end());// 删除从it到end的所有元素

7.5clear()

flst.clear();// 清空所有元素

7.6swap()

forward_list<int>flst2;flst.swap(flst2);// 交换两个forward_list的内容

8. 特殊操作

8.1splice_after()

forward_list<int>flst2={4,5,6};flst.splice_after(flst.before_begin(),flst2);// 将flst2所有元素移动到flst头部

8.2remove()

flst.remove(5);// 删除所有值为5的元素

8.3remove_if()

flst.remove_if([](intn){returnn%2==0;});// 删除所有偶数

8.4unique()

flst.unique();// 删除连续重复元素

8.5merge()

forward_list<int>flst2={4,5,6};flst.sort();flst2.sort();flst.merge(flst2);// 合并两个已排序forward_list

8.6sort()

flst.sort();// 升序排序flst.sort(greater<int>());// 降序排序

8.7reverse()

flst.reverse();// 反转forward_list

9. 迭代器

9.1before_begin()

autoit=flst.before_begin();// 获取第一个元素前的位置

9.2begin()&end()

for(autoit=flst.begin();it!=flst.end();++it){cout<<*it<<" ";}

10. 完整示例

#include<iostream>#include<forward_list>#include<algorithm>usingnamespacestd;intmain(){// 创建并初始化forward_listforward_list<int>flst={2,3,4};// 头部操作flst.push_front(1);// 头部插入1// 访问元素cout<<"First element: "<<flst.front()<<endl;// 插入元素autoit=flst.insert_after(flst.begin(),5);// 在第二个位置插入5flst.insert_after(it,{7,8,9});// 在5后面插入7,8,9// 删除元素flst.pop_front();// 删除头部元素flst.remove(8);// 删除所有8// 特殊操作forward_list<int>flst2={10,11,12};flst.splice_after(flst.before_begin(),flst2);// 合并flst2到flstflst.sort();// 排序flst.unique();// 去重// 遍历forward_listcout<<"All elements: ";for(intnum:flst){cout<<num<<" ";}cout<<endl;// 容量信息cout<<"Is empty: "<<(flst.empty()?"Yes":"No")<<endl;return0;}

11. 性能提示

  1. 在已知位置插入/删除元素性能很好(O(1)O(1)O(1))
  2. 查找元素需要遍历(O(n)O(n)O(n))
  3. 迭代器在插入/删除操作后仍然有效(除非删除的是迭代器指向的元素)
  4. list更节省内存(每个节点少一个指针)
  5. 适合只需要单向遍历且对内存敏感的场合
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 17:28:55

【Shell脚本函数介绍】

文章目录一、什么是函数&#xff1f;二、函数的定义方式1. 普通写法2. 带 function 关键字写法三、函数的调用四、函数参数示例五、函数返回值1. 使用 return 返回状态码&#xff08;0~255&#xff09;2. 使用 echo 返回值六、函数与全局变量/局部变量一、什么是函数&#xff1…

作者头像 李华
网站建设 2026/4/14 10:08:11

在潘多拉圣树下烤串:论AI“片场探班”如何在科幻迷头上拉屎

《在潘多拉圣树下烤串&#xff1a;论AI“片场探班”如何在科幻迷头上拉屎》 近来忽见一种“新式供奉”盛行于短视频之野&#xff1a;有人以五十元成本、几句“提示词”&#xff0c;便将自己送入《阿凡达3》片场&#xff0c;与奈蒂莉执手自拍&#xff0c;同卡梅隆谈笑风生&…

作者头像 李华
网站建设 2026/4/4 15:49:11

hbuilderx下载项目应用:学生如何高效搭建前端环境

学生如何用HBuilderX高效搭建前端开发环境&#xff1f;从下载到实战一步到位 你是不是也经历过这样的场景&#xff1a;刚上完一节前端课&#xff0c;老师布置了“做一个个人主页”的作业&#xff0c;结果还没开始写代码&#xff0c;就在安装工具这一步卡住了&#xff1f; Nod…

作者头像 李华
网站建设 2026/4/9 19:02:00

基于遗传算法优化BP神经网络的时间序列预测探索

基于遗传算法&#xff08;GA)优化的BP神经网络的时间序列预测 遗传算法工具箱为goat(北卡罗来纳大学) 单隐含层 基于MATLAB环境在数据驱动的时代&#xff0c;时间序列预测是众多领域如金融、气象、工业生产等中至关重要的任务。今天咱们就来唠唠基于遗传算法&#xff08;GA&…

作者头像 李华
网站建设 2026/4/13 17:36:43

ECS系统入门手记——其二

前言 还是因为期末考试导致ECS系统的学习推迟了很久&#xff0c;再加上ECS的内容比较抽象&#xff0c;这里只是简单讲讲进阶内容 原型和chunk 在笔记一中我们介绍了chunk&#xff0c;我们知道IJobEntity是它的语法糖&#xff0c;现在&#xff0c;让我们正式和它见一面吧。 简单…

作者头像 李华