C++ STL 容器 forward_list类型

介绍

std::forward_list 是 C++ 标准模板库 (STL) 中的一个单向链表容器。与 std::list 不同,std::forward_list 只允许从头部到尾部的单向迭代,不支持反向迭代。因此,std::forward_list 在某些操作上可能比 std::list 更高效,尤其是在插入和删除元素时。

下面是 std::forward_list 的一些主要特点和操作:

特点

  1. 单向迭代:std::forward_list 只提供单向迭代器,这意味着你只能从链表的头部开始遍历到尾部。

  2. 内存效率:std::forward_list 通常比 std::list 更节省内存,因为它不需要存储每个节点的前驱指针。

  3. 常数时间插入和删除:在 std::forward_list 的头部插入和删除元素是常数时间操作。然而,在链表中间或尾部插入或删除元素需要线性时间,因为需要遍历到相应的位置。

  4. 不支持随机访问:由于 std::forward_list 是链表结构,因此不支持随机访问迭代器。你不能使用下标操作符([])或 at() 函数来直接访问元素。

操作

std::forward_list 提供了一系列成员函数来操作链表:

  • begin(): 返回指向链表第一个元素的迭代器。
  • end(): 返回指向链表末尾之后位置的迭代器。
  • empty(): 检查链表是否为空。
  • size(): 返回链表中元素的数量。
  • front(): 返回链表中第一个元素的引用。
  • back(): 返回链表中最后一个元素的引用。
  • push_front(const value_type& value): 在链表头部插入一个元素。
  • pop_front(): 删除链表头部的元素。
  • insert_after(const_iterator position, const value_type& value): 在给定位置之后插入一个元素。
  • erase_after(const_iterator position): 删除给定位置之后的元素。
  • clear(): 清空链表中的所有元素。
  • swap(forward_list& other): 交换两个链表的内容。

forward_list中的特殊迭代器

 a.before_begin(); //返回一个指向链表之前的迭代器
a.erase_after(a.before_begin());
// 这个函数删除由pos参数指定的位置之后的元素。
//如果pos是before_begin()返回的迭代器,那么erase_after实际上会删除链表的第一个元素。

代码

    using Group = std::forward_list<float>;

    // 初始化
Group a;
Group b=a;
Group c(a);
Group d(1.1);
Group e(1.1,2.2);
Group f(e.begin(),e.end());
Group g({1.0f,2.0f,3.0f});
Group h = {1.0f,2.0f}; auto bb = a.before_begin(); //返回一个指向链表之前的迭代器
a.erase_after(a.before_begin());
// 这个函数删除由pos参数指定的位置之后的元素。
//如果pos是before_begin()返回的迭代器,那么erase_after实际上会删除链表的第一个元素。
b.push_front(1.2f); //先构造一个元素,然后插入头部
b.emplace_front(1.3f); //在forward_list头部直接构造一个元素,比push_front更快 auto iter = b.insert_after(b.before_begin(),100.0f); //在链表第一个元素位置插入100f,返回位置迭代器
iter = b.insert_after(b.before_begin(),10,-10.0f);
b.insert_after(b.before_begin(),h.begin(),h.end()); b.remove(1.0f); //删除1.0f
b.remove_if([](auto u){ //自定义删除
return u>100.0f;
});
b.reverse(); //元素位置全部首尾交换
b.sort(); //排序
b.merge(g); //合并两个链表,然后g的元素跟着b的末尾元素位置,g元素清空
b.unique(); //删除掉链表中重复元素
b.splice_after(b.before_begin(),c );
//把c全部元素移动到b的首部,移动过去的时候c元素顺序不变,c内容被清空

C++ STL 容器 forward_list类型的更多相关文章

  1. STL容器-- forward_list 用法

    http://www.cplusplus.com/reference/forward_list/

  2. c++ STL 常用容器元素类型相关限制 指针 引用

    c++ 的 STL 中主要有 vector , list, map, set  , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...

  3. STL容器概述

    STL容器 1.容器概述 1.1.容器分类 1.1.1.顺序容器:提供对元素序列的访问,顺序容器为元素连续分配内存或将元素组织为链表,元素的类型是容器成员value_type. 顺序容器 说明 vec ...

  4. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  5. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  6. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  7. STL容器的适用情况

     转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...

  8. STL容器与配接器

    STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector                             行为类似于数组,但可以根据要求 ...

  9. STL容器的本质

    http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...

  10. 不要在公共接口中传递STL容器

    最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...

随机推荐

  1. vue获取子组件的实例$el、$attrs和inheritAttrs的使用

    我的需求 有些时候,我们需要获取组件的DOM元素 有些小伙伴会说,这还不简单 直接使用this.$ref.xx不就可以了吗 我们来看一下,是不是我们想的那样简单 组件内容 <template&g ...

  2. vue动画appear 实现页面刚展示出来的时候,入场效果

    <style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0; transform: translateY(80px); } . ...

  3. 【JS逆向百例】某音乐网分离式 webpack 非 IIFE 改写实战

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  4. Git、Github、Gitlab与Gitee

    Git.Github.Gitlab与Gitee之间的关系 Git 是一种版本控制系统,是一个命令,是一种工具,有点像cmd(命令行工具). Github 是一个基于git实现在线代码托管的仓库,向互联 ...

  5. Postfix + Extmail 企业邮件服务器搭建

    ExtMail套件用于提供从浏览器中登录.使用邮件系统的Web操作界面,而Extman套件用于提供从浏览器中管理邮件系统的Web操作界面.它以GPL版权释出,设计初衷是希望设计一个适应当前高速发展的I ...

  6. 【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程

    链表的合并 导航小助手 说在前面 题目链接 链表结构 OJ21.合并两个有序链表 题目描述和算法分析 接口的完整实现代码 OJ23.合并K个升序链表 题目描述和算法分析 接口的完整实现代码 尾声 说在 ...

  7. PyTorch下,使用list放置模块,导致计算设备不一的报错

    报错 在复现 Transformer 代码的训练阶段时,发生报错: RuntimeError: Expected all tensors to be on the same device, but f ...

  8. 升腾C92 刷 OpenWrt 作旁路由设置 DNS 服务、扩容分区、设置 swap

    最新博客文章链接 文字更新时间:2024/02/04 一直知道 OpenWrt 经常拿来做软路由软件.最近买了个二手小主机升腾 C92 来做旁路由服务器,其被归为瘦客户机一类,感觉和工控机差不多,现价 ...

  9. 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)

    可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...

  10. 20.2 显示的链接到导出符号--《Windows核心编程》

    FAPPROC GetProcAddress(HMOUDLE hInstDll,PCSTR pszSymbolName); 1.根据名称 FARPROC FunctionAddress = (ULON ...