C++11 新特性:std::forward_list 前向列表

std::forward_list是 C++11 引入的一个标准库容器,它实现了一个单向链表。

与其他序列容器(如std::liststd::vector)相比,std::forward_list更加轻量,因为它只维护到下一个元素的链接,而没有维护到上一个元素的链接,这使得它在某些场景下更高效。

使用场景

std::forward_list适用于以下几种场景:

  1. 空间敏感:当内存使用是一个关键因素,而且需要经常在列表前端进行插入或删除操作时,std::forward_list是一个好选择,因为它的内存开销相对较小。

  2. 单向遍历:当数据结构只需要单向遍历,不需要双向遍历时,使用std::forward_list可以节省空间。

  3. 动态数据:对于需要频繁和动态地添加和删除元素的场景,尤其是在不关心元素间顺序或频繁在序列中间进行插入和删除操作时,std::forward_list提供了灵活的动态数据管理。

常用方法

std::forward_list提供了一系列方法来进行元素的访问、修改、迭代器获取等操作:

  • 元素访问:

    • front(): 返回链表中第一个元素的引用。
  • 容量:

    • empty(): 检查链表是否为空。
    • max_size(): 返回链表可以容纳的最大元素数量(理论上的)。
  • 修改器:

    • clear(): 删除链表中的所有元素。
    • insert_after(): 在指定位置之后插入元素。
    • emplace_after(): 在指定位置之后就地构造元素。
    • erase_after(): 删除指定位置之后的元素。
    • push_front(): 在链表前端添加元素。
    • emplace_front(): 在链表前端就地构造元素。
    • pop_front(): 删除链表中的第一个元素。
    • resize(): 调整链表的大小。
    • swap(): 与另一个std::forward_list交换内容。
  • 操作:

    • merge(): 合并两个已排序的链表。
    • splice_after(): 将另一个链表中的元素转移至当前链表中指定位置之后。
    • remove() / remove_if(): 删除满足特定条件的元素。
    • reverse(): 反转链表。
    • unique(): 移除连续重复元素。
    • sort(): 对链表进行排序。
  • 迭代器:

    • begin(), end(): 获取指向链表开始和结束的迭代器。
    • cbegin(), cend(): 获取指向链表开始和结束的常量迭代器。

示例代码

#include <forward_list>
#include <iostream>int main() {std::forward_list<int> flist = {1, 2, 3, 4, 5};// 向前端插入元素flist.push_front(0);// 删除第一个元素flist.pop_front();// 遍历并打印元素std::cout << "Elements in forward_list: ";for (auto& elem : flist) {std::cout << elem << " ";}std::cout << std::endl;// 反转链表flist.reverse();// 打印反转后的链表std::cout << "Reversed forward_list: ";for (auto& elem : flist) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

输出:

Elements in forward_list: 1 2 3 4 5 
Reversed forward_list: 5 4 3 2 1 

总结

std::forward_list是 C++11 中引入的一个高效的单向链表容器,它提供了灵活的元素管理方法,适用于需要频繁进行插入和删除操作的场景。

由于其内部实现只维护单向链接,std::forward_list在空间使用上比std::list更加高效。通过合理利用std::forward_list提供的方法,可以在保证性能的同时,编写出清晰、简洁的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国34401A安捷伦数字万用表

181/2461/8938产品概述&#xff1a; 附加功能: 6 1/2位数分辨率10种测量功能:DC/交流电压、DC/交流电流、2线和4线电阻、二极管、连续性、频率、周期基本精度:0.0035% DC&#xff0c;0.06%交流1000 V最大电压输入&#xff0c;3 A最大电流输入每秒1000次读数512读取记忆 安捷…

Linux C++ 027-STL之deque容器

Linux C 027-STL之deque容器 本节关键字&#xff1a;Linux、C、deque 相关库函数&#xff1a;pubsh_back、begin、front、sort deque基本概念 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作。 deque 与 vector 的区别&#xff1a; &#xff08;1&#x…

odoo中在聊天器中记录用户修改

在Odoo中&#xff0c;在聊天器&#xff08;或称为消息通讯工具&#xff09;中记录用户修改是一种常见的做法&#xff0c;它有助于追踪和记录用户与系统之间的交互&#xff0c;包括用户对数据的修改。这可以通过创建审计日志或者在消息通知中记录用户的操作来实现。下面将介绍如…

vue将html生成pdf并分页

jspdf html2canvas 此方案有很多的css兼容问题&#xff0c;比如虚线边框、svg、页数多了内容显示不全、部分浏览器兼容问题&#xff0c;光是解决这些问题就耗费了我不少岁月和精力 后面了解到新的技术方案&#xff1a; jspdf html-to-image npm install --save html-to-i…

Centos7 Python3安装

下载&#xff1a;CNPM Binaries Mirror https://cdn.npmmirror.com/binaries/python/3.11.6/Python-3.11.6.tgz 安装相关依赖 yum install zlib-devel bzip2-devel libffi-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 安装 tar -zx…

关于pandas 无法读取 csv 文件数据的解决方式

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 …

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量 在电气化铁路运输中&#xff0c;受电弓滑板的健康状况对于保障列车安全行驶至关重要。受电弓滑板作为连接电网与列车的直接介质&#xff0c;其磨损情况直接影响到电能的有效传输及列车的稳定运行。精确、快速测量受电弓滑板磨损情…

IntelliJ IDEA 2024.1安装与激活[破解]

一&#xff1a;IDEA官方下载 ①如题&#xff0c;先到IDEA官方下载&#xff0c;简简单单 ②IDEA官方&#xff1a;IntelliJ IDEA – the Leading Java and Kotlin IDE 二&#xff1a;获取脚本 &#x1f31f;网盘下载&#xff1a;jetbra (密码&#xff1a;lzh7) &#x1f31f;获取…

CLI的使用与IOS基本命令

1、实验目的 通过本实验可以掌握&#xff1a; CLI的各种工作模式个CLI各种编辑命令“?” 和【Tab】键使用方法IOS基本命令网络设备访问限制查看设备的相关信息 2、实验拓扑 CLI的使用与IOS基本命令使用拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;CLI模式的切…

Visual Studio Code 终端为管理员权限

第一部 1、 Visual Studio Code 快捷方式启动选项加上管理员启动 第二步 管理员方式运行 powershell Windows 10的任务栏自带了搜索。或者开始菜单选搜索只需在搜索框中输入powershell。 在出来的搜索结果中右击Windows PowerShell&#xff0c;然后选择以管理员方式运行。 执…

使用Docker Registry-v2搭建镜像仓库详细教程

我们使用docker来部署私有化镜像仓库… 1、下载 registry:v2 镜像 docker pull registry:22、在私有仓库所在的主机目录新建一个文件夹&#xff0c;用于持久化保存仓库中的镜像 mkdir -p /opt/registry3、启动registry镜像 使用docker镜像启动私有仓库容器服务&#xff0c;…

ArcGIS Desktop使用入门(四)工具箱——属性域

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

nacos服务治理

nacos 服务演变之路 单体架构 集群级垂直化 SOA 微服务 微服务优缺点 SOA与微服务区别 springcloud技术栈 服务发现概念 服务发现两种方式–客户端服务发现 服务发现两种方式–服务端发现 服务发现技术对比 nacos架构图 nacos实战 服务发现 源码解析 nacos实现了springcloud…

网络安全---RSA公钥加密与签名

实验项目&#xff1a;RSA公钥加密与签名实验 1.实验目的 本实验的学习目标是让学生获得 RSA 算法的动手经验。 通过课堂学习&#xff0c;学生应该已经了解 RSA 算法的理论部分&#xff0c; 知道在数学上如何生成公钥、私钥以及如何执行加密、解密和签名生成、验证。 通过使用…

Docker容器嵌入式开发:Docker Ubuntu18.04配置mysql数据库

在 Ubuntu 18.04 操作系统中安装 MySQL 数据库的过程。下面是安装过程的详细描述: 首先,使用以下命令安装 MySQL 服务器: sudo apt install mysql-server系统会提示是否继续安装,按下 Y 键确认。 安装过程中,系统会下载并安装 MySQL 相关的软件包,包括 libaio1、mysql…

STM32+ESP8266水墨屏天气时钟:文字取模和图片取模教程

项目背景 本次的水墨屏幕项目需要显示一些图片和文字&#xff0c;所以需要对图片和文字进行取模。 取模步骤 1.打开取模软件 2.选择图形模式 3.设置字模选项 注意&#xff1a;本次项目采用的是水墨屏&#xff0c;并且是局部刷新的代码&#xff0c;所以设置字模选项可能有点…

实验3 交换机基本配置

实验3 交换机基本配置 一、 原理描述二、 实验目的三、 实验内容四、实验步骤1.建立实验拓扑2.设备编址3.检测链路连通性4.交换机双工模式配置 一、 原理描述 交换机&#xff08;Switch&#xff09;也称为交换式集线器&#xff0c;其工作在OSI 第二层&#xff08;数据链路层)上…

Windows摄像头推流-RTSP

0.背景&#xff1a; 调试rtsp视频流时&#xff0c;没有网络摄像头怎么办&#xff0c;只需要在同一个局域网下&#xff0c;用windows推送rtsp流&#xff0c;就可以在linux进行接收。 1.下载资源包 资源包链接&#xff1a;https://pan.baidu.com/s/1008I7TKazE4JgFiozhtekg?pw…

【算法深度探索】动态规划之旅(1):挑战OJ题海,解锁15道经典难题,让你成为DP大师!

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧月&#xff0c;独傲天下百坚强。 男儿应有龙…

智慧公厕:提升城市管理效率,改善居民生活体验

智慧公厕作为城市基础设施的重要组成部分&#xff0c;正逐渐成为改善城市品质和提升居民生活体验的一项关键措施。通过智能化管理、数字化使用和信息化运行&#xff0c;智慧公厕不仅可以为城市居民带来更舒适便利的使用体验&#xff0c;而且对于城市的高质量发展、宜居性和包容…