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. Python 潮流周刊第 19 期摘要

    原文全文:https://pythoncat.top/posts/2023-09-09-weekly 文章&教程 1.Mojo 终于提供下载了! 2.我们能从 PEP-703 中学到什么? 3 ...

  2. 遇到一个bug,组件不更新内容

    解决办法 当v-if的值发生变化时,组件都会被重新渲染一遍.因此,利用v-if指令的特性,可以达到强制刷新组件的目的. <template> <comp v-if="upd ...

  3. 辣鸡 mac 下 pycharm 中代码拖拽的问题

    Editor –> General Enable Drag'n'Drop functionality in Editor

  4. 使用OpenCV实现视频去抖

    使用OpenCV实现视频去抖 整体步骤: 设置输入输出视频 寻找帧之间的移动:使用opencv的特征检测器,检测前一帧的特征,并使用Lucas-Kanade光流算法在下一帧跟踪这些特征,根据两组点,将 ...

  5. 【奶奶看了也不会】微信群聊(微信客服)接入ChatGPT教程

    1.聊天效果展示 大家好,我是小卷.最近工作变卷了,都已经一个月没更新文章了.今天来教教大家怎么给微信群聊的智能客服接入ChatGPT.和之前企业微信机器人不同的是,这次是可以外部微信群使用的.用的人 ...

  6. NC23501 小A的回文串

    题目链接 题目 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意.现在小A可以对这个字符串 ...

  7. es6 快速入门 系列 —— 解构

    其他章节请看: es6 快速入门 系列 解构 我们经常使用数组或对象存储数据,然后从中提取出相关数据信息 试图解决的问题 以前开发者为了从对象或数组中提取出特定数据并赋值给变量,编写了很多重复的代码, ...

  8. 惠普CP1025后盖传感器松导致不停自检或打印中掉电, 跳闪三角灯

    上次修了离合器, 没出两星期又出问题了. CP1025这个型号就是出名的开机特别慢, 正常自检是1分钟, 但是前天我在给机器换完粉盒后, 自检似乎进入了死循环, 一直在自检. 周末才有空看看能不能解决 ...

  9. Ubuntu18.04 Server安装Harbor

    Harbor是一个开源的本地部署的容器镜像注册中心, 带访问权限控制, 以及管理界面. 作用类似于Java中Maven的私有仓库Nexus, 用于配合Jenkins在部署容器到K8s时提供镜像源, 加 ...

  10. Vuex中的核心方法

    Vuex中的核心方法 Vuex是一个专为Vue.js应用程序开发的状态管理模式,其采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.每一个Vuex应用的核心就是 ...