C++容器之 forward_list (单向链表)使用说明

目录

1.  语法格式

2.  说明

3.  用法示例


1.  语法格式

    描述控制可变长度元素序列的对象。该序列存储为单向(前向)链接的节点列表,每个节点包含一个 Type 类型的成员。

template <class Type,

    class Allocator = allocator<Type>>

    class forward_list;

Type:要存储在 forward_list 中的元素数据类型。

Allocator存储的分配器对象,封装了有关 forward_list 内存分配和释放的详细信息。此参数为可选参数。默认值为 allocator<Type>

2.  说明

    forward_list 对象通过基于 allocator 类(通常称为 std::allocator)的 Allocator 类存储对象为其控制的序列分配和释放存储空间。allocator 对象必须具有与 allocator 类型对象相同的外部接口。

    当迭代器、指针和引用所控制的序列中的元素通过 forward_list 删除时,它们可能会失效。通过 forward_list 对受控序列执行插入和拼接操作不会使迭代器失效。

    受控序列的添加可以通过调用 forward_list::insert_after 来实现,该函数是唯一一个调用构造函数 Type(const T&) 的成员函数。forward_list 也可能调用移动构造函数。如果此类表达式引发异常,则容器对象不会插入任何新元素并重新引发异常。因此,当发生此类异常时,forward_list 类型的对象处于已知状态。

    分配容器对象时,不会复制存储的分配器对象。

    forward_list 容器和双向链表容器list的主要设计区别在于,前者在内部只保留指向下一个元素的链接,而后者每一个元素保留两个链接:一个指向下一个元素,一个指向前一个元素,从而允许双向高效迭代,但每个元素会消耗额外的存储空间,并且插入和删除元素的时间开销略高。因此,forward_list 对象比列表对象更高效,尽管它们只能向前迭代。对于存储零个或少数几个元素的场景非常合适

    与其他基本标准序列容器(数组、向量和双端队列)相比,forward_list 在容器内任何位置插入、提取和移动元素方面通常表现更佳,因此在大量使用这些元素的算法(例如排序算法)中也表现出色。

    与其他序列容器相比,forward_list 和列表的主要缺点在于它们无法通过元素的位置直接访问元素;例如,要访问 forward_list 中的第六个元素,必须从起始位置迭代(即遍历)到该位置,这需要线性时间。它们还会消耗一些额外的内存来保存与每个元素关联的链接信息(这对于包含小元素的大型列表来说可能是一个重要因素)。

    forward_list 类模板在设计时就考虑到了效率:从设计上讲,它与简单的手写 C 语言单链表一样高效,事实上,它是唯一一个出于效率考虑而故意省略 size 成员函数的标准容器:由于其链表性质,如果 size 成员函数的执行时间是常量级的,则需要维护一个内部计数器来记录其大小(就像双向list一样)。这会消耗一些额外的存储空间,并使插入和删除操作的效率略有降低。要获取 forward_list 对象的大小,可以使用距离算法及其 begin end 函数,这是一个线性时间操作。

3.  用法示例

// forward_list_splice_after.cpp

// compile with: /EHsc /W4

#include <forward_list>

#include <iostream>

using namespace std;

template <typename S> void print(const S& s) {

    for (const auto& p : s) {

        cout << "(" << p << ") ";

    }

    cout << endl;

}

int main()

{

    forward_list<int> c1{ 10, 11 };

    forward_list<int> c2{ 20, 21, 22 };

    forward_list<int> c3{ 30, 31 };

    forward_list<int> c4{ 40, 41, 42, 43 };

    forward_list<int>::iterator where_iter;

    forward_list<int>::iterator first_iter;

    forward_list<int>::iterator last_iter;

    cout << "Beginning state of lists:" << endl;

    cout << "c1 = ";

    print(c1);

    cout << "c2 = ";

    print(c2);

    cout << "c3 = ";

    print(c3);

    cout << "c4 = ";

    print(c4);

    where_iter = c2.begin();

    ++where_iter; // start at second element

    c2.splice_after(where_iter, c1);

    cout << "After splicing c1 into c2:" << endl;

    cout << "c1 = ";

    print(c1);

    cout << "c2 = ";

    print(c2);

    first_iter = c3.begin();

    c2.splice_after(where_iter, c3, first_iter);

    cout << "After splicing the first element of c3 into c2:" << endl;

    cout << "c3 = ";

    print(c3);

    cout << "c2 = ";

    print(c2);

    first_iter = c4.begin();

    last_iter = c4.end();

    // set up to get the middle elements

    ++first_iter;

    c2.splice_after(where_iter, c4, first_iter, last_iter);

    cout << "After splicing a range of c4 into c2:" << endl;

    cout << "c4 = ";

    print(c4);

    cout << "c2 = ";

    print(c2);

}

输出:

Beginning state of lists:c1 = (10) (11)c2 = (20) (21) (22)c3 = (30) (31)c4 = (40) (41) (42) (43)After splicing c1 into c2:c1 =c2 = (20) (21) (10) (11) (22)After splicing the first element of c3 into c2:c3 = (30)c2 = (20) (21) (31) (10) (11) (22)After splicing a range of c4 into c2:c4 = (40) (41)c2 = (20) (21) (42) (43) (31) (10) (11) (22)

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

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

相关文章

ali 轻量服务器安装nginx

# Ubuntu sudo apt install nginx-light # 精简版 # CentOS sudo yum install nginx #启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx #验证安装 nginx -v curl -I 127.0.0.1 #常用命令&#xff1a; # 重新加载配…

【设计模式】4.代理模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 代理模式 1. 第一版 class SchoolGirl:def __init__(self):self._name Nonepropertydef name(self):return self._namename.setterdef name(self, valu…

基于微信小程序的美食点餐订餐系统

文章目录 1. 项目概述2. 项目思维导图3. 系统架构特点4. 核心模块实现代码1. 登录注册2. 首页模块实现4. 分类模块实现5. 购物车模块实现6. 订单模块实现 5. 注意事项6. 项目效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 在移动互联网时代&#xff0c;餐饮行业数字化…

[neo4j]介绍4个开源的知识图谱项目

项目主要介绍几个开源项目&#xff1a; QASystemOnMedicalKG&#xff1a;医疗知识图谱问答 https://github.com/liuhuanyong/QASystemOnMedicalKG Agriculture_KnowledgeGraph&#xff1a;农业知识图谱 Financial-Knowledge-Graphs&#xff1a;小型金融知识图谱 stock-know…

20倍光学镜头怎么实现20+20倍数实现

1. 硬件选择 球机摄像头 选择40倍光学变焦的摄像头 &#xff1a;确保摄像头具有足够的变焦能力&#xff0c;同时考虑摄像头的分辨率、帧率、夜视功能等。 内置云台 &#xff1a;许多高端摄像头已经内置了云台功能&#xff0c;如果是这样&#xff0c;可以简化机械设计和电机控制…

Axios 在 Vue3 项目中的使用:从安装到组件中的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

【Python打卡Day50】预训练模型与CBAM注意力@浙大疏锦行

现在我们思考下&#xff0c;是否可以对于预训练模型增加模块来优化其效果&#xff0c;这里我们会遇到一个问题: 预训练模型的结构和权重是固定的&#xff0c;如果修改其中的模型结构&#xff0c;是否会大幅影响其性能。其次是训练的时候如何训练才可以更好的避免破坏原有的特征…

ONLYOFFICE Jira 集成应用程序 4.0.0 发布,含新的文件格式支持等多个重大更新!

ONLYOFFICE 与 Jira 集成的重大更新现已发布&#xff01;使用 ONLYOFFICE Docs 在 Jira Software 中处理各种办公文档&#xff0c;从 4.0.0 版本开始&#xff0c;ONLYOFFICE 连接器允许您编辑 PDF 文件和表单、直接从编辑器创建新文件、可视化用户头像、在 Jira 平台内处理新文…

安装区块链相关Geth(基于CentOS7)

注&#xff1a;由于版本冲突问题&#xff0c;请严格按如下介绍版本进行安装 安装所需资料&#xff1a;通过网盘分享的文件&#xff1a;区块链_CSDN 链接: https://pan.baidu.com/s/1dn5xcLtwwFy90xhOWKiWyA?pwdzgzs 提取码: zgzs --来自百度网盘超级会员v6的分享 一、安装运…

系统分析师——计算机系统基础

系统分析师——计算机系统基础 引言 作为系统分析师学习的第一节课&#xff0c;计算机系统基础部分构建了整个知识体系的核心框架。本文将围绕计算机系统的层次结构、硬件组成、软件分类以及关键技术点进行详细总结&#xff0c;为后续深入学习奠定基础。 本节学习内容如下图&…

JS常用设计模式汇总

1、基于类的单例模式 // PageManager.js class PageManager {constructor(config) {if (!PageManager.instance) {this.config config;this.initialized false;PageManager.instance this;this.init();}return PageManager.instance;}init() {if (this.initialized) return…

迈向软件开发 T 型人才之路:构建多元能力体系

在软件开发的广袤天地里&#xff0c;T 型人才备受瞩目。这类人才犹如具备强大能量的 “多面手”&#xff0c;既有深入专精的技术能力&#xff0c;又有广泛多元的知识与技能储备&#xff0c;能够从容应对复杂多变的项目需求&#xff0c;引领行业创新发展。于当今社会而言&#x…

SALMONN-omni论文阅读

论文链接 项目链接 名词理解&#xff1a; backchanneling&#xff1a; 指的是听话人在不打断说话人的情况下&#xff0c;用简短的语气词或动作表示“我在听”“我理解了”的反馈。 常见示例包括&#xff1a; “嗯哼”&#xff08;“uh-huh”&#xff09; “对的”&#xff08…

区块链:什么是DeFi?

DeFi&#xff08;去中心化金融&#xff0c;Decentralized Finance&#xff09; 是一种基于区块链技术的金融生态系统&#xff0c;旨在通过去中心化的方式提供传统金融服务&#xff08;如借贷、交易、储蓄等&#xff09;&#xff0c;无需依赖银行、经纪商等中介机构。DeFi主要构…

idea编译器使用git拉取、提交非常慢的原因和解决方案

前言 最近在公司换了一个电脑,但是发现这个电脑用idea编译器使用git拉取、提交各种操作非常慢,有时候需要等10分钟左右,这明显是不对劲的,说明电脑的某些环境影响到git和idea之间的整合了。 目录 在idea拉取代码非常慢的原因 解决方案 在idea拉取代码非常慢的原因 经过排查…

C语言变量的奇妙世界:探秘作用域

资料合集下载链接: ​​https://pan.quark.cn/s/472bbdfcd014​​ 在C语言的编程世界里,变量是我们存储和操作数据的基础。然而,仅仅知道如何定义和使用变量是远远不够的。一个更深层次的理解,在于掌握变量的“作用域”——也就是变量在程序中可以被访问和使用的范围。这就…

恒流源和直流稳压电源 电路

目录 前言一、恒流源电路1.低端反馈2.低端反馈注意事项注意1&#xff1a;电阻Rx注意2&#xff1a;三极管和运放的限制 3.高端反馈注意&#xff1a;自激振荡方案二 二、直流稳压电源电流1.带反馈2.不带反馈3.区别 前言 基础知识可以看个人笔记&#xff1a;个人笔记 一、恒流源…

那些年,曾经辉煌过的数据库

滚滚长江东逝水&#xff0c;浪花淘尽英雄&#xff01; 数据库的演进史&#xff0c;正是这样一部“英雄迭代”的壮阔史诗。从早期数据模型的拓荒者&#xff0c;到关系型数据库的商业巨头&#xff1b;从桌面应用的普及者&#xff0c;再到开源与大数据时代的弄潮儿&#xff1b;每…

2D曲线点云平滑去噪

2D曲线点云&#xff0c;含许多噪声&#xff0c;采用类似移动最小二乘的方法&#xff08;MLS)分段拟合抛物线并投影至抛物线&#xff0c;进行点云平滑去噪。 更通俗的说法是让有一定宽度的曲线点云&#xff0c;变成一条细曲线上的点。 分两种情况进行讨论&#xff1a; 1&#…

【平面波导外腔激光器专题系列】用于精密测量的平面波导外腔激光器特性

----翻译自Kenji Numata等人的文章 摘要 1542 nm平面波导外腔激光器PW-ECL具有足够低的噪声非常适合精密测量应用。与 0.1mHz至100kHz 之间&#xff0c;其频率和强度噪声与非平面环形振荡器 NPRO和光纤激光器相当或更好。通过将 PW-ECL 的频率稳定在乙炔&#xff08;13C2H2&a…