c++ std::forward_list使用笔记

这里写目录标题

      • [1. 包含头文件](#1. 包含头文件)
      • [2. 创建和初始化](#2. 创建和初始化)
      • [3. 添加元素](#3. 添加元素)
      • [4. 遍历元素](#4. 遍历元素)
      • [5. 删除元素](#5. 删除元素)
      • [6. 其他常用操作](#6. 其他常用操作)
      • [7. 示例代码](#7. 示例代码)
      • 输出结果
      • 总结

std::forward_list 是 C++ 标准库中的一个单向链表容器。它只支持从头部到尾部的前向遍历,因此在某些场景下比 std::list 更加高效。以下是一些 std::forward_list 的基本使用方法:

1. 包含头文件

首先需要包含 <forward_list> 头文件:

cpp 复制代码
#include <forward_list>
#include <iostream>

2. 创建和初始化

可以创建一个空的 std::forward_list,或者使用初始化列表进行初始化:

cpp 复制代码
std::forward_list<int> list1; // 创建一个空的 forward_list
std::forward_list<int> list2 = {1, 2, 3, 4, 5}; // 使用初始化列表

3. 添加元素

由于 std::forward_list 是单向链表,只能在头部插入元素,或者在某些特定位置插入元素:

cpp 复制代码
list1.push_front(10); // 在头部插入元素
list1.push_front(20); // 再次在头部插入元素

4. 遍历元素

可以使用范围 for 循环或迭代器来遍历 std::forward_list:

cpp 复制代码
// 使用范围 for 循环
for (const auto& elem : list2) {
    std::cout << elem << " ";
}
std::cout << std::endl;

// 使用迭代器
for (auto it = list1.begin(); it != list1.end(); ++it) {
    std::cout << *it << " ";
}
std::cout << std::endl;

5. 删除元素

可以使用 pop_front() 删除头部的元素,或者使用 erase_after() 删除特定位置的元素:

cpp 复制代码
list1.pop_front(); // 删除头部元素

auto it = list2.before_begin(); // 获取第一个元素之前的位置
list2.erase_after(it); // 删除第一个元素

6. 其他常用操作

  • empty():检查链表是否为空。
  • clear():清空链表。
  • insert_after():在指定位置后插入元素。
cpp 复制代码
if (!list1.empty()) {
    std::cout << "list1 is not empty" << std::endl;
}

list1.clear(); // 清空链表

auto it = list2.before_begin();
list2.insert_after(it, 100); // 在第一个元素之前插入 100

7. 示例代码

以下是一个完整的示例代码:

cpp 复制代码
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> list = {1, 2, 3, 4, 5};

    // 在头部插入元素
    list.push_front(0);

    // 遍历并打印元素
    for (const auto& elem : list) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    // 删除第一个元素
    list.pop_front();

    // 再次遍历并打印元素
    for (const auto& elem : list) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    // 在第二个元素之后插入 100
    auto it = list.begin();
    list.insert_after(it, 100);

    // 最终遍历并打印元素
    for (const auto& elem : list) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果

复制代码
0 1 2 3 4 5 
1 2 3 4 5 
1 100 2 3 4 5 

总结

std::forward_list 是一个轻量级的单向链表容器,适合在需要频繁在头部插入或删除元素的场景中使用。由于它只支持前向遍历,因此在需要双向遍历的场景中,std::list 可能更为合适。

相关推荐
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
qq_284274059 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_2842740510 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan202411 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
半杯咖啡半行码11 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
xh didida12 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
垆边人似月.12 小时前
华为机试题 :两数之和
c++·算法·华为
深圳老胡12 小时前
STM32CubeMX 生成 CMake 工程,用 VSCode 编译与调试的完整流程
笔记·stm32·单片机·代码规范
个 人 练 习 生12 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
垆边人似月.12 小时前
华为机试题 :有效的括号
c++·算法·华为