【C++顺序容器】forward_list的成员函数和非成员函数

news2024/11/27 9:38:36

目录

forward_list

1. forward_list的成员函数

1.1 构造、析构和赋值运算符重载

1.1.1 构造函数

1.1.2 析构函数

1.1.3 赋值运算符重载

1.2 迭代器

1.3 容量

1.4 元素访问

1.4.1 遍历方法

1.5 修改器

1.6 操作

1.7 观察者

2. forward_list的非成员函数


forward_list

forward_list是序列容器,允许在序列的任何位置进行定时插入和删除操作。

forward_list是作为单链表实现的;单链表可以将其包含的每个元素存储在不同的、不相关的存储位置。单链表可以将其包含的每个元素存储在不同的相关存储位置中,通过将每个元素链接到序列中的下一个元素来保持排序。

forward_list容器和list容器在设计上的主要区别在于,前者只在内部保留一个指向下一个元素的链接,而后者则为每个元素保留两个链接:一个指向下一个元素,一个指向上一个元素,这样就可以在两个方向上高效地迭代,但每个元素会消耗额外的存储空间,而且插入和移除元素的时间开销会稍高一些。

与其他基本的标准序列容器(array、vector和deque)相比,forward_list在插入、提取和移动容器内任意位置的元素方面通常表现更好,因此在密集使用这些元素的算法(如排序算法)中也表现更好。

与这些其他序列容器相比,forward_list和list的主要缺点是它们不能通过元素的位置直接访问元素;例如,要访问forward_list中的第6个元素,就必须从开头迭代到该位置,这需要的时间与它们之间的距离成线性关系。它们还需要消耗一些额外的内存来保存与每个元素相关的链接信息(这对于由小尺寸元素组成的大列表来说可能是一个重要因素)。

forward_list类模板的设计考虑到了效率:事实上,它是唯一一个出于效率考虑而故意缺少size成员函数的标准容器:由于其作为链表的性质,如果size成员需要恒定的时间,那么它就需要为其大小保留一个内部计数器(就像list那样)。这将消耗一些额外的存储空间,并使插入和删除操作的效率略低。要获得一个forward_list对象的大小,可以使用距离算法来计算它的begin和end,这是一个需要线性时间的操作。

使用forward_list类型要包含forward_list头文件;forward_list定义在命名空间std中。

1. forward_list的成员函数

1.1 构造、析构和赋值运算符重载

1.1.1 构造函数

重载函数功能

default

构造空的forward_list类对象
fill用n个val来构造
range用迭代器区间[first,last)中的元素顺序构造

copy

构造一个x的拷贝
move移动构造函数
initializer list用初始化列表来构造
#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl1;//default
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//空

	forward_list<int> fl2(10, 1);//fill
	for (auto e : fl2)
	{
		cout << e << " ";
	}
	cout << endl;
	//1 1 1 1 1 1 1 1 1 1

	string s("hello world");
	forward_list<char> fl3(s.begin() + 3, --s.end());//range
	for (auto e : fl3)
	{
		cout << e << " ";
	}
	cout << endl;
	//l o   w o r l

	forward_list<char> fl4(fl3);//copy
	//等价于forward_list<char> fl4 = fl3;
	for (auto e : fl4)
	{
		cout << e << " ";
	}
	cout << endl;
	//l o   w o r l

	forward_list<int> fl5{ 2,4,6,8 };//initializer list
	//等价于forward_list<int> fl5 = { 2,4,6,8 };
	for (auto e : fl5)
	{
		cout << e << " ";
	}
	cout << endl;
	//2 4 6 8

	return 0;
}

1.1.2 析构函数

1.1.3 赋值运算符重载

1.2 迭代器

函数功能
before_beginbefore_begin返回一个迭代器,指向forward_list对象的第一个元素的前一个位置

begin

&

end

begin返回一个迭代器,指向forward_list对象的第一个元素

end返回一个迭代器,指向forward_list对象的最后一个元素的下一个位置

cbefore_begincbefore_begin返回一个const迭代器,指向forward_list对象的第一个元素的前一个位置

cbegin

&

cend

cbegin返回一个const迭代器,指向forward_list对象的第一个元素

cend返回一个const迭代器,指向forward_list对象的最后一个元素的下一个位置

before_begin&begin&end返回的迭代器指向:

const_iterator是一个指向const内容的迭代器。迭代器本身可以修改,但是它不能被用来修改它所指向的内容。

before_begin&begin&end和cbefore_begin&cbegin&cend的不同:

  • before_begin&begin&end的返回类型由对象是否是常量来决定。如果不是常量,返回iterator;如果是常量,返回const_iterator。
  • cbefore_begin&cbegin&cend的返回类型是const_iterator,不管对象本身是否是常量。
#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl{ 4,5,6,7 };
	fl.insert_after(fl.before_begin(), 3);
	for (auto e : fl)
	{
		cout << e << " ";
	}
	cout << endl;
	//3 4 5 6 7

	forward_list<int>::iterator it = fl.begin();
	while (it != fl.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//3 4 5 6 7

	return 0;
}

1.3 容量

函数功能
empty检测forward_list是否为空,是返回true,否则返回false
max_size返回forward_list所能容纳的最大元素数
#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl{ 4,5,6,7 };

	if (fl.empty())
		cout << "forward_list为空" << endl;
	else
		cout << "forward_list不为空" << endl;
	//forward_list不为空

	cout << fl.max_size() << endl;//536870911

	return 0;
}

1.4 元素访问

函数功能
front返回forward_list中第一个元素的引用
#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl{ 4,5,6,7 };

	cout << fl.front() << endl;//4

	return 0;
}

1.4.1 遍历方法

1.4.1.1 迭代器

#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl{ 4,5,6,7 };

	forward_list<int>::iterator it = fl.begin();
	while (it != fl.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//4 5 6 7

	return 0;
}

1.4.1.2 范围for

#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl{ 4,5,6,7 };

	for (auto e : fl)
	{
		cout << e << " ";
	}
	cout << endl;
	//4 5 6 7

	return 0;
}

1.5 修改器

函数功能
assign给forward_list赋值,替换其当前内容
emplace_front在开头构建和插入元素
push_front头插
pop_front头删
emplace_after构建和插入元素
insert_after在position位置之后插入
erase_after删除position位置之后的元素或范围
swap交换内容
resize

调整forward_list的大小为n(影响size)

●如果n<当前forward_list的大小,多余的元素会被截掉

●如果n>当前forward_list的大小,则:

  1)如果没有指定填充元素,则在最后插入尽可能多的元素以达到n的大小

  2)如果指定了填充元素val,则多出的空间用val填充

●如果n也>当前forward_list的容量,则会自动重新分配存储空间

clear清空内容
#include <iostream>
#include <forward_list>
#include <string>
using namespace std;

int main()
{
	forward_list<int> fl1{ 4,5,6,7 };

	fl1.assign({ 1,2,3,4,5,6 });
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//1 2 3 4 5 6

	fl1.push_front(0);
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//0 1 2 3 4 5 6

	fl1.pop_front();
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//1 2 3 4 5 6

	fl1.insert_after(fl1.before_begin(), 0);
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//0 1 2 3 4 5 6

	fl1.erase_after(fl1.begin());
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//0 2 3 4 5 6

	forward_list<int> fl2{ 4,5,6,7,8,9,10 };

	fl1.swap(fl2);
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//4 5 6 7 8 9 10

	fl1.resize(12, 5);
	for (auto e : fl1)
	{
		cout << e << " ";
	}
	cout << endl;
	//4 5 6 7 8 9 10 5 5 5 5 5

	fl1.clear();
	if (fl1.empty())
		cout << "fl1被清空" << endl;
	else
		cout << "fl1没被清空" << endl;
	//fl1被清空

	return 0;
}

1.6 操作

函数功能
splice_after将元素从x转移到容器中,在position位置之后插入
remove移除具有特定值的元素
remove_if删除满足条件的元素
unique去重
merge合并有序列表
sort排序
reverse反转元素的顺序

1.7 观察者

函数功能
get_allocator获取空间配置器

2. forward_list的非成员函数

函数功能
relational operators关系运算符重载
swap交换内容

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

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

相关文章

npm5中本地间模块引用的最好方式(附带引用方法总结)

引用其他的包 正常情况下在项目 package.json 所在的目录&#xff08;一般也是项目根目录&#xff09;运行npm install xxxx 命令之后&#xff0c;会从远程或者代理地址下载xxxx包到node_modules&#xff0c;然后在package.json生成对应的包名和版本 如果想要依赖本地自己开发…

TypeScript 学习笔记(一):类型

文章目录 一、常见类型1. 数组2. 布尔3. 数值4. 字符串5. object6. null 和 undefined7. symbol7.1 作为属性名7.2 属性名遍历7.3 静态方法&#xff1a;Symbol.for()和 Symbol.keyFor()7.4 内置 symbol 值7.4.1 Symbol.hasInstance7.4.2 Symbol.isConcatSpreadable7.4.3 Symbol…

第四十五章Java 接口

Java 接口 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xff0c;在JAVA编程语言中是一个抽象类型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface来声明。一个类通过继承接口的方式&#xff0c;从而来继承接口的抽象方法。 接口并不是类&#x…

DevOps(二)

CD 1. 平台选择2. 技术选型3. 阶段性目标4. 搭建示例4.1 环境准备(节点机)1. java版本升级2. 编译安装git3. docker安装4. docker-compose安装5. sonarqube安装6. harbor安装7. gitlab私服 4.2 示例一&#xff08;手动&#xff09;1. 创建项目2. 编码3. Dockerfile4. 拷贝pytho…

【linux】线程详解

线程 线程的概念 在官方书籍对于线程的概念&#xff1a; 1.在进程内部的执行流 2.线程比进程粒度更细&#xff0c;调度成本更低。 3.线程是CPU调度的最小单位。 线程&#xff08;tcb&#xff09;&#xff1a;进程&#xff08;pcb&#xff09; n&#xff1a;1 进程和线程在执…

Java 动态规划 面试题 17.16. 按摩师

代码展示&#xff1a; class Solution {public int massage(int[] nums) {int nnums.length;if(n0){return 0;}//创建数组int f[]new int[n]; //f[i]表示接i位置的最长时间int g[]new int[n]; //g[i]表示不接i位置的最长时间//初始化f[0]nums[0];g[0]0;//填充数组for(int i1;i…

VectorCAST单元测试手动配置测试用例

一、单元测试 等待环境创建完成后&#xff0c;就可以开始单元测试。 二、生成测试用例 在 VectorCAST 中&#xff0c;一共有两种方法来生成测试用例&#xff0c;一种是手动生成测试用例&#xff0c;另外一种是自动 生成测试用例。 三、手动生成测试用例 在 VectorCAST 中&a…

《面试1v1》Redis分布式锁

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

泛微E-Cology SQL注入漏洞复现(QVD-2023-15672)

0x01 产品简介 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 0x02 漏洞概述 由于泛微e-cology未对用户的输入进行有效的…

matlab学习指南(2):安装工具箱Toolbox的方法(详细图解)

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

【项目 进程1】2.1 进程概述 2.2 进程状态转换

文章目录 2.1进程概述程序和进程**时间片****并行和并发****进程控制块(PCB)** 2.2进程状态转换**进程的状态** **进程相关命令****实时显示进程动态** 2.1进程概述 程序和进程 程序是包含一系列信息的文件&#xff0c;这些信息描述了如何在运行时创建一个进程&#xff1a; …

Linux的软链接与硬链接

Linux的软链接与硬链接 1&#xff0c;创建硬链接&#xff1a;2&#xff0c;创建软链接&#xff1a;3&#xff0c;软链接是什么4&#xff0c;软链接文件的权限5&#xff0c;硬链接是什么6&#xff0c;做个小实验 总结问题&#xff1a;为什么有软链接了&#xff08;快捷方式&…

Centos7.9通过expect脚本批量修改H3C交换机配置

背景&#xff1a; 公司有几百台H3C二层交换机设备&#xff0c;当需要批量更改配置时非常的消耗工作量 解决&#xff1a; 通过一台Linux服务器&#xff0c;编写shell脚本&#xff0c;模拟Telnet至各台交换机&#xff0c;让一切变的很容易 1.首先在安装Telnet服务前需要检测centO…

Java基础(动力节点课程)

JavaSE基础——第一章初识Java JavaSE JavaEE JavaMEJavaSEJavaEEJavaME Java语言跨平台性垃圾回收机制Java的加载和执行JDK、JRE、JVM关系安装JDK以及配置PATHJDK目录说明 第一个Java程序javac命令和java命令的具体用法javac命令的用法&#xff1a;java命令的用法&#xff1a;…

Transformer网络学习记录——基于空间约束自注意力和Transformer的RGB-D显著性检测方法研究

基于图半监督学习和图卷积的目标分割与跟踪算法研究 (wanfangdata.com.cn) 只能说看不懂&#xff0c;记录是为了有耐心慢消化 原文&#xff1a; 网络整体为通用的编码器-解码器架构 &#xff0c;总体上由骨干编码器、交互编码器、RGB 解码器、深度解码器组成。 具体来说&#…

ROCKSDB原理

按照读写的性质来分 分为读少写多和 写少读多 RocksDB适用于第一种。 磁盘中的数据结构 就地写和追加写 找到某一个页 然后将数据刷入到这一个页中. 这就导致了一个问题 就是追加写入的数据冗余 由于存在数据冗余 所以必须要对数据进行一定的处理才能保持查找性能 数据以块…

langchain系列:Model I/O模块之-Prompts

文章目录 Model I/O简介输入部分&#xff08;Prompts&#xff09;PromptTemplatefrom_template ChatPromptTemplate langchain是基于大语言模型而开发的一个框架&#xff0c;既然是基于大语言模型&#xff0c;自然最重要的就是先要介绍Model I/O模块。 Model I/O简介 Model I/O…

Helm3安装和使用

Helm3安装和使用 1、Helm简介 Helm 是 Kubernetes 上的包管理器&#xff0c;用来管理 Kubernetes 应用程序&#xff0c;Helm Charts 可帮助您定义&#xff0c;安装和升级 复杂的 Kubernetes 应用程序。Helm 把 Kubernetes 资源(比如deployments、services或ingress等) 打包到…

ProtoBuf的学习并且制作了一个网络通讯录项目

Linux环境下载安装ProtoBuf编译器 1. 安装依赖库 Ubuntu用户选择 sudo apt-get install autoconf automake libtool curl make g unzip -yCentos用户选择 sudo yum install -y autoconf automake libtool curl make gcc-c unzip2. 下载ProtoBuf编译器 Github地址&#xff…

kmalloc与vmalloc如何选择

kmalloc和vmalloc都是Linux内核中用于内存分配的函数&#xff0c;但它们适用于不同的内存分配场景。 kmalloc函数用于在内核空间中分配小块&#xff08;通常小于一个页面大小&#xff09;的连续内存区域&#xff0c;这些内存区域可以用于存储内核数据结构和缓冲区等。kmalloc内…