C++ STL forward_list容器

一、前言

forward_list 是 C++ 11 新添加的一类容器,其底层实现和 list 容器一样,采用的也是链表结构,只不过 forward_list 使用的是单链表,而 list 使用的是双向链表。单链表只能从前向后遍历,而不支持反向遍历,因此 forward_list 容器只提供前向迭代器,而不是双向迭代器。因此forward_list 容器不具有 rbegin()、rend() 之类的成员函数。存储相同个数的同类型元素,单链表耗用的内存空间更少,空间利用率更高,并且对于实现某些操作单链表的执行效率也更高

二、forward_list容器的创建

在使用时,需添加头文件:

#include <forward_list>
using namespace std;

一共有5种方式

①std::forward_list<int> forwardListInt;
②std::forward_list<int> forwardListInt(10);
③std::forward_list<int> forwardListInt(10, 5);
④std::forward_list<int> forwardListInt2(forwardListInt);
⑤//拷贝普通数组,创建forward_list容器
int a[] = { 1,2,3,4,5 };
std::forward_list<int> values(a, a+5);
//拷贝其它类型的容器,创建forward_list容器
std::array<int, 5> arrayInt{ 11,12,13,14,15 };
std::forward_list<int> forwardListInt(arrayInt.begin()+2, arr.end());

方式与list容器类似,在这里不再说明

三、支持的方法

不说明迭代器、插入和删除等方法

函数说明
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false
max_size()返回容器所能包含元素个数的最大值,一般是 232-1
front()返回第一个元素的引用
assign()用新元素替换容器中原有内容
swap(x,y)交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的
resize()调整容器的大小
merge()合并两个事先已排好序的 forward_list 容器,并且合并之后的 forward_list 容器依然是有序的
sort()通过更改容器中元素的位置,将它们进行排序
reverse()反转容器中元素的顺序

这些方法的使用在list容器中已经说明过,在这里不再重复。

四、实例

1、获取forward_list 容器的元素个数

forward_list 容器中不提供size()方法,想要获取forward_list 容器的存储的元素个数可以使用头文件 <iterator> 中的 distance() 函数。

std::forward_list<int> listInt1{ 72,73,100,72,44,48,109,92,671,109,15,671 };
    **int nCount = std::distance(std::begin(listInt1), std::end(listInt1));**

    std::cout << " forward_list listInt1 size: " << nCount << std::endl;

结果如下:
image.png

2、advance()

移动迭代器位置

 std::forward_list<int> listInt1{ 72,73,100,72,44,48,109,92,671,109,15,671 };
    int nCount = std::distance(std::begin(listInt1), std::end(listInt1));
    std::forward_list<int>::iterator listIter = listInt1.begin();
   ** advance(listIter, 5);**
    int i = 0;
    for (; listIter != listInt1.end(); listIter++)
    {
        std::cout << " forward_list[" << i++ << "]=" << *listIter << std::endl;
    }

    std::cout << " forward_list listInt1 size: " << nCount << std::endl;

结果如下:
image.png
所以,advance()仅仅是移动迭代器的位置,不会影响容器的大小

小菜鸟一枚,望各位大佬不吝指教,用于记录学习

1 声望
0 粉丝
0 条评论
推荐阅读
C++ STL multiset容器
multiset 类模板提供的构造函数,和 set 类模板中提供创建 set 容器的构造函数,是完全相同的。因此创建set容器的方式适用于创建multiset容器。具体的方法参考set容器:[链接]

等待樱花盛开阅读 967

麒麟操作系统 (kylinos) 从入门到精通 - 研发环境 - 第二十一篇 C++/C语言开发环境搭建
类别:笔记本型号:中国长城 NF14C硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,c++,c,内核飞腾,arm

码上世界1阅读 2.3k评论 1

封面图
万字避坑指南!C++的缺陷与思考(下)
导读 | 在万字避坑指南!C++的缺陷与思考(上)一文中,微信后台开发工程师胡博豪,分享了C++的发展历史、右值引用与移动语义、类型说明符等内容,深受广大开发者喜爱!此篇,我们邀请作者继续总结其在C++开发过...

腾讯云开发者4阅读 472评论 1

一种将函数模板定义和声明分开的方法
&emsp;&emsp;在 C++ 中为了操作简洁引入了函数模板。所谓的函数模板实际上是建立一个通用函数,其函数类型或形参类型不具体指定,用一个虚拟的类型来表达,这个通用函数就称为函数模板。

Sharemaker阅读 852

封面图
Workflow的JSON解析器
Workflow中有一个小而美的json-parser,一千行代码写得非常典雅精致。不仅可以学习到经典的C语言写法、递归解析的架构、与内核近似的编码风格、简洁的接口设计,而且也非常方便引入项目中作为轻量级的json解析器...

1412阅读 790

C发展史的特点与常见的C语言程序
1、1963年,剑桥人学将ALGOL 60语言发展成为CPL语言。2、1967年,朝侨大学的Martin Richards 对CPL语言进行了简化,产生了BCPL语言。3、1970年,美国贝尔实验室的Ken Thompson将BCPL中的精华提炼出来,并为它起了...

菜鸟明轩阅读 736

C语言中的4大基本数据类型
⭐基本数据类型 整型 int 字符型 char 实型(浮点型):单精度实型 float 双精度实型 double⭐构造类型数组类型结构类型 struct联合类型 union枚举类型 enum⭐指针类型⭐空类型 void

菜鸟明轩阅读 700

封面图

小菜鸟一枚,望各位大佬不吝指教,用于记录学习

1 声望
0 粉丝
宣传栏