乐趣区

关于c++:C-STL-forwardlist容器

一、前言

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;

后果如下:

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;

后果如下:

所以,advance()仅仅是挪动迭代器的地位,不会影响容器的大小

退出移动版