C/C++|容器(forward_list用法及示例)

forward_list用法及示例
文章目录

  • forward_list用法及示例
    • 简介
    • 容器特性
    • 使用
      • 成员函数
      • 几种创建方式
    • 示例:
      • demo1:
      • demo2: 获取元素个数(forward_list没有size()成员函数)
      • demo3: 可使用std::advance()更便捷的移动迭代器(注意不要越界)

简介 forward_list是单链表容器
是 C++ 11 新添加的一类容器,其底层实现和 list 容器一样,采用的也是链表结构,只不过使用的是单链表
容器特性 链表中数据的存储位置是分散的、随机的,整个链表中数据的线性关系通过指针来维持
可以在序列已知的任何位置快速插入或删除元素(时间复杂度为O(1))。
只能从前向后遍历,不支持反向遍历
较list相比,执行相同的操作效率更高
使用 成员函数
成员函数 功能
before_begin() 返回一个前向迭代器,其指向容器中第一个元素之前的位置。
begin() 返回一个前向迭代器,其指向容器中第一个元素的位置。
end() 返回一个前向迭代器,其指向容器中最后一个元素之后的位置。
cbefore_begin() 和 before_begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
max_size() 返回容器所能包含元素个数的最大值。一般是 2的32次方-1 或者2的62次方-1。
front() 返回第一个元素的引用。
assign() 用新元素替换容器中原有内容。
push_front() 在容器头部插入一个元素。
emplace_front() 在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。
pop_front() 删除容器头部的一个元素。
emplace_after() 在指定位置之后插入一个新元素,并返回一个指向新元素的迭代器。和 insert_after() 的功能相同,但效率更高。
insert_after() 在指定位置之后插入一个新元素,并返回一个指向新元素的迭代器。
erase_after() 删除容器中某个指定位置或区域内的所有元素。
swap() 交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
resize() 调整容器的大小。
clear() 删除容器存储的所有元素。
splice_after() 将某个 forward_list 容器中指定位置或区域内的元素插入到另一个容器的指定位置之后。
remove(val) 删除容器中所有等于 val 的元素。
remove_if() 删除容器中满足条件的元素。
unique() 删除容器中相邻的重复元素,只保留一个。
merge() 合并两个事先已排好序的 forward_list 容器,并且合并之后的 forward_list 容器依然是有序的。
sort() 通过更改容器中元素的位置,将它们进行排序。
reverse() 反转容器中元素的顺序。
几种创建方式
  1. 创建一个空forward_list容器:
std::forward_list test;

  1. 创建一个包含n个元素的forward_list容器:
std::forward_list test(10);

  1. 创建一个包含n个元素的forward_list容器,并赋初始值:
std::forward_list test(10, 5);

std::forward_list test{1,2,3,4,5,6,7,8,9,10};

  1. 通过拷贝已有forward_list容器创建新的forward_list容器:
std::forward_list tmp(10); std::forward_list test(tmp);

  1. 通过拷贝其他类型容器(或数组)中指定区域内的元素来创建新的forward_list容器:
int a[] = { 1,2,3,4,5 }; std::forward_list test(a, a+5);

std::arrayarr{ 1,2,3,4,5 }; std::forward_listtest(arr.begin()+1, arr.end()-1);

示例: demo1:
#include #include int main() { std::forward_list test{1,2,3,4,5,6,7,8,9,10}; test.emplace_front(-1); //头部插入一个元素{-1,1,2,3,4,5,6,7,8,9,10}; test.emplace_after(test.begin(), 0); //指定位置之后插入一个元素{ -1,0,1,2,3,4,5,6,7,8,9,10 }; test.emplace_after(test.before_begin(), -2); //指定位置之后插入一个元素{-2,-1,0,1,2,3,4,5,6,7,8,9,10}; test.reverse(); //反转{10,9,8,7,6,5,4,3,2,1,0,-1,-2} for (auto i : test) { std::cout << i << " "; } std::cout << std::endl; }

10 9 8 7 6 5 4 3 2 1 0 -1 -2

demo2: 获取元素个数(forward_list没有size()成员函数)
【C/C++|容器(forward_list用法及示例)】可以使用头文件 中的 distance() 函数
#include #include #include int main() { std::forward_list test{1,2,3,4,5,6,7,8,9,10}; int size = std::distance(test.begin(), test.end()); int size2 = std::distance(std::begin(test), std::end(test)); std::cout << "size:" << size << std::endl; std::cout << "size2:" << size2 << std::endl; }

size:10 size2:10

demo3: 可使用std::advance()更便捷的移动迭代器(注意不要越界)
#include #include int main() { std::forward_list test{1,2,3,4,5,6,7,8,9,10}; auto it = test.begin(); std::advance(it, 5); *it = 60; for (auto i : test) { std::cout << i << " "; } std::cout << std::endl; }

1 2 3 4 5 60 7 8 9 10

    推荐阅读