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

目录

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;//defaultfor (auto e : fl1){cout << e << " ";}cout << endl;//空forward_list<int> fl2(10, 1);//fillfor (auto e : fl2){cout << e << " ";}cout << endl;//1 1 1 1 1 1 1 1 1 1string s("hello world");forward_list<char> fl3(s.begin() + 3, --s.end());//rangefor (auto e : fl3){cout << e << " ";}cout << endl;//l o   w o r lforward_list<char> fl4(fl3);//copy//等价于forward_list<char> fl4 = fl3;for (auto e : fl4){cout << e << " ";}cout << endl;//l o   w o r lforward_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 8return 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 7forward_list<int>::iterator it = fl.begin();while (it != fl.end()){cout << *it << " ";++it;}cout << endl;//3 4 5 6 7return 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;elsecout << "forward_list不为空" << endl;//forward_list不为空cout << fl.max_size() << endl;//536870911return 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;//4return 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 7return 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 7return 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 6fl1.push_front(0);for (auto e : fl1){cout << e << " ";}cout << endl;//0 1 2 3 4 5 6fl1.pop_front();for (auto e : fl1){cout << e << " ";}cout << endl;//1 2 3 4 5 6fl1.insert_after(fl1.before_begin(), 0);for (auto e : fl1){cout << e << " ";}cout << endl;//0 1 2 3 4 5 6fl1.erase_after(fl1.begin());for (auto e : fl1){cout << e << " ";}cout << endl;//0 2 3 4 5 6forward_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 10fl1.resize(12, 5);for (auto e : fl1){cout << e << " ";}cout << endl;//4 5 6 7 8 9 10 5 5 5 5 5fl1.clear();if (fl1.empty())cout << "fl1被清空" << endl;elsecout << "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.hqwc.cn/news/22566.html

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

相关文章

3.SpringBoot 返回Html界面

1.添加依赖spring-boot-starter-web <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>2.创建Html界面 在Resources/static 文件夹下面建立对应的html&#xff0c…

实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation

目录 前言一、步骤二、PnP估计Head Pose&#xff0c;并显示1.引入库2.结果展示 总结 前言 YOLO&#xff18;的集成度比较高&#xff0c;如何在简洁的代码中加入Head Pose的东西&#xff0c;不是一件简单的事情&#xff0e;这里介绍如何插入PnP算法实现头部姿态估计的代码&…

Linux学习之vim在光标所在处写入内容,保存退出

vim insertTest使用vim打开一个叫做insertTest新文件。 输入命令之后&#xff0c;按下Enter&#xff08;回车键&#xff09;&#xff0c;就可以进入下边的操作页面。 按i在当前光标位置处&#xff0c;就可以插入内容了。 接下来写入内容跟记事本里边是差不多的。 按一下…

python_day8_综合案例

综合案例&#xff0c;全球GDP排行榜 1、知识点补充&#xff1a;sort()方法 sort()方法&#xff1a; 列表.sort(key选择排序依据的函数,reverseTrue|False) my_list [[a, 33], [b, 55], [c, 11]]def choose_sort_key(element):return element[1] # 列表中每个元素传进来&am…

Office如何通过VSTO进行PPT插件开发?

文章目录 0.引言1.工具准备2.PPT外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO&#xff08;Visual Studio Tools for Office &#xff09;是VBA的替代&#xff0c;是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展O…

(转载)从0开始学matlab(第11天)—关系运算符和逻辑运算符

选择结构的运算由一个表达式控制的&#xff0c;这个表达式的结果只有 true(1)和 false(0)。有两种形式的运算符可以在 MATLAB 中关系得到 true/false&#xff1a;关系运算符和逻辑运算符。跟 C 语言一样&#xff0c;MATLAB 没有布尔型和逻辑数据类型。MATLAB 把 0 值作为结果fa…

android JSBridge的加载时机问题

https://github.com/lzyzsd/JsBridge 也算是比较悠久和使用了。 可供参考的android和IOS&#xff0c;以及前端的使用 https://segmentfault.com/a/1190000018208609 遇到的问题&#xff1a; 比如&#xff1a; 从前端在加载WebView的时候&#xff0c;执行了某些动作&#xff0c…

FreeRTOS 低功耗模式设计 STM32平台

1. STM32F105RBT6 的三种低功耗模式 1.1 sleep睡眠模式、stop停机模式、standby 待机模式 1.2 STM32中文参考手册有介绍STM32 低功耗模式的介绍 2. FreeRTOS 采用的是时间片轮转的抢占式任务调度机制&#xff0c;其低功耗设计思路一般是&#xff1a; ① 当运行空闲任务&#…

【UE4 C++】08-生成抛射物来模拟攻击效果

步骤 新建一个C类&#xff0c;父类为Actor&#xff0c;命名为“ASMagicProjectile” 在“ASMagicProjectile.h”中添加如下代码&#xff1a; 在“ASMagicProjectile.cpp”中添加如下代码&#xff1a; 编译后在虚幻编辑器中新建一个蓝图&#xff0c;选择父类为我们刚创建的C类…

Java设计模式之行为型-迭代器模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 迭代器模式是一种常用的设计模式&#xff0c;它主要用于遍历集合对象&#xff0c;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。 举个简单的…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、…

Android Framework岗位面试真题分享

Handler是Android中的消息处理机制&#xff0c;是一种线程间通信的解决方案&#xff0c;同时你也可以理解为它天然的为我们在主线程创建一个队列&#xff0c;队列中的消息顺序就是我们设置的延迟的时间&#xff0c;如果你想在Android中实现一个队列的功能&#xff0c;不妨第一时…