首页 > 编程语言 >C++ STL 容器 forward_list类型

C++ STL 容器 forward_list类型

时间:2024-02-27 22:35:46浏览次数:35  
标签:std begin STL 元素 list C++ 链表 forward

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内容被清空

标签:std,begin,STL,元素,list,C++,链表,forward
From: https://www.cnblogs.com/AndreaDO/p/18038390

相关文章

  • STL-vector模拟实现
    #pragmaonce#include<assert.h>#include<iostream>usingstd::cout;usingstd::endl;usingstd::cin;namespacetest{//#include<algorithm>//模板参数省略:1.作为时2.作为类型名template<classT>//数组名:类型名:xx数组classvector......
  • STL-list模拟实现
    #pragmaonce#include"16my_Itetator.h"//测试用#include<iostream>//测试用usingstd::cout;usingstd::endl;usingstd::cin;namespacetest{//struct默认权限是public,一般也不会加权限,class才会(需要封装时使用class)//结点使用struct的好处是开放结点,......
  • STL-stack模拟实现
    #pragmaonce#include<assert.h>#include<list>#include<vector>#include<deque>#include<iostream>usingstd::cout;usingstd::endl;usingstd::cin;namespacetest{//template<classT,classContainers=std::vector&......
  • STL-queue模拟实现
    #include<list>#include<assert.h>#include<deque>#include<iostream>usingstd::cout;usingstd::endl;usingstd::cin;namespacetest{//template<classT,classContainers=std::list<T>>template<classT,c......
  • 从面向对象的角度看集合类,以List<String> list = new ArrayList<>()为例
    心血来潮琢磨了这么一个问题:Listlist=newArrayList<>();这句代码挺常用的,但是如果要从面向对象的角度去讲讲这句代码背后的逻辑,该怎么讲?好像真不容易一口气说完整,于是便有了本文的梳理。从关系图我们可以知道,ArrayList继承自一个抽象类AbstractCollection,它们都实现了Lis......
  • C++特殊类的设计与单例模式
    //1.设计一个不能被拷贝的类/*解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。C++98;将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即......
  • C++11的类型转换
    //C类型转换/*C语言:显式和隐式类型转换1.隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2.显式类型转化:需要用户自己处理.隐式类型:界定:相关类型,相近类型,意义相似的类型可以发生类型转换,如整型和浮点可以发生类型转换,因为他们都表示数据的大......
  • 【现代C++】2.强化语言运行期的强化
    1.Lambda表达式lambda表达式实际提供了一个类似匿名函数的特性,匿名函数是在需要一个函数,但是又不想费力去命名一个函数的情况下使用的。1.1Lambda表达式基本语法[捕获列表](参数列表)mutable(可选)异常属性->返回类型{//函数体}捕获列表分为以下几种:1.1.1值捕......
  • C++11新特性的一些用法举例①
    //字符串字面量/*常用:1.原始字符串字面量---括号内保持原样输出---没有转义字符,如\n不再是换行,而是直接输出字面量\nR"(str)";实例:R"(aa\a"b"bb)";//print:aa\a"b"bb注意:constchar*s1=R"foo(HelloWorld)foo";打印结果:HelloWorld;----//&qu......
  • C++ STL 容器 list类型
    C++STL容器list类型list对于异常支持很好,要么成功,要么不会发生什么事情以下是std::list在异常处理方面表现良好的几个原因:动态内存管理:std::list使用动态内存分配来存储元素,这意味着它会在需要时自动分配内存,并在不再需要时释放内存。这种自动管理可以减少内存泄漏和悬......