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()仅仅是移动迭代器的位置,不会影响容器的大小

阅读 471

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

1 声望
0 粉丝
0 条评论
你知道吗?

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

1 声望
0 粉丝
文章目录
宣传栏