AndreaDO

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

C++ STL 容器 forward_list类型

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

posted on   AndreaDO  阅读(32)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示