使用过C++单向链表吗?一起来围观下,C++标准库std::forward_list单向链表的使用

01 std::forward_list介绍

std::forward_list是C++标准库中的一个单向链表容器。它与list双向链表不同,它只支持从头部到尾部的顺序遍历。

在std::forward_list的前端进行插入和删除操作的时间复杂度是 O(1)。std::forward_list不支持常数时间的随机访问。要访问某个特定的元素,必须从头开始遍历。

02 初始定义

以下示例分别定义存储不同数据元素的单向链表容器对象。

#include <forward_list>

// 自定义类。
class MyClass;

// 定义存储int整数单向链表容器对象。
std::forward_list<int> myForwardList1;

// 定义存储float浮点数单向链表容器对象。
std::forward_list<float> myForwardList2;

// 定义存储MyClass类单向链表容器对象。
std::forward_list<MyClass> myForwardList3;
  • 通过初始值定义示例:
#include <forward_list>

// 定义并初始化为:1 3 5 2 4
std::forward_list<int> myForwardList{ 1,3,5,2,4 };

03 添加元素

  • 将元素添加到容器开头:

push_front()和emplace_front()函数用于将元素添加到容器的开头。

// 将元素添加到容器开头示例。
myForwardList.push_front(100);
myForwardList.push_front(200);
myForwardList.emplace_front(300);
  • 将元素添加到迭代器的后面:

insert_after()和emplace_after()函数用于将元素添加到迭代器容器的后面。

// 将元素添加到指定迭代器(第一个元素)的后面示例。
myForwardList.insert_after(100);
myForwardList.insert_after(200);
myForwardList.emplace_after(300);

04 删除元素

  • 删除容器开头元素:

pop_front()函数用于删除容器开头元素。

// 删除开头元素示例。
myForwardList.pop_front();
  • 删除迭代器后面元素:

erase_after()函数用于删除迭代器后面元素。

// 删除第一个元素后面的元素(删除第一个元素)示例。
myForwardList.erase_after(myForwardList.begin());
  • 通过remove函数删除指定元素示例:
// 删除所有元素值等于100元素。
myForwardList.remove(100);

05 访问和修改元素

  • 访问和修改开头元素:

front()函数用于访问容器开头元素。如果容器为空,函数会抛出异常。

// 访问容器开头元素示例。
int v = myForwardList.front();

// 修改容器开头元素值示例。
myForwardList.front() = 1000;
  • 修改指定元素值:

通过迭代器遍历容器,修改指定元素值。

/***
* 例子: ****/

// 遍历容器,找到值等于2元素,并修改为200。
for (auto iter = myForwardList.begin(); iter!=myForwardList.end(); ++iter) {
    // 元素值
    int v = *iter;
    if (2 == v) {   // 元素值等于2
        // 修改元素值
        *iter = 2000;    
    }
}

06 遍历元素

#include <forward_list>
#include <iostream>

// 定义并初始化为:1 3 5 2 4
std::forward_list<int> myForwardList{ 1,3,5,2,4 };

// 遍历容器所有元素示例。
for (int v : myForwardList) {
    // 输出 1 3 5 2 4
    std::cout << "v = " << v << std::endl;
}

07 元素排序

  • 升序排序:
#include <forward_list>
#include <iostream>

// 定义并初始化为:1 3 5 2 4
std::forward_list<int> myList{ 1,3,5,2,4 };

// 默认排序(升序)示例。
myForwardList.sort();

// 遍历容器所有元素示例。
for (int v : myList) {
    // 输出 1 2 3 4 5
    std::cout << "v = " << v << std::endl;
}
  • 使用lambda表达式自定义排序:
#include <forward_list>
#include <iostream>

// 定义并初始化为:1 3 5 2 4
std::forward_list<int> myList{ 1,3,5,2,4 };

// 使用lambda表达式实现降序示例。
myForwardList.sort(

    {
        return a > b;
    }
);

// 遍历容器所有元素示例。
for (int v : myList) {
    // 输出 5 4 3 2 1
    std::cout << "v = " << v << std::endl;
}

08 附录:完整源码

关注公众号下载本示例完整源码(23_std_forward_list_example.zip)。

-【End】-

#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。

喜欢本文章,记得点赞、分享、关注哦~

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

20YC编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值