当前位置: 首页 > news >正文

C++ 标准特性:array forward_list

C++ 标准特性:array & forward_list


一、array(STL array 容器)—— C++11

1.1 概述

std::array是 C++11 标准中新增的序列容器,它封装了固定大小的 C 风格数组。

特性说明
头文件<array>
大小编译期确定,不可动态改变
底层封装 C 风格数组
优势比原生数组更安全,支持迭代器和 STL 算法
vector的区别vector大小可变,array大小固定,array性能更接近原生数组

1.2 示例代码

#include<iostream>#include<array>// array容器usingnamespacestd;intmain(){std::array<int,5>arr{};// 初始化arr容器for(inti=1;i<arr.size();i++){arr.at(i)=i;}// 通过get()重载函数输出指定位置元素值cout<<"输出结果为"<<get<4>(arr)<<endl;return0;}

1.3 代码解析

array<int,5>arr{};// 创建 int 类型、大小为 5 的 array,初始值为 0arr.at(i)=i;// 带越界检查的访问(越界时抛 std::out_of_range)arr[i]=i;// 另一种访问方式(不检查越界,性能更高)get<4>(arr);// 编译期索引访问,索引越界会在编译时报错
访问方式检查时机安全性
arr[i]无检查⚠️ 越界未定义行为
arr.at(i)运行时检查✅ 越界抛异常
get<N>(arr)编译期检查✅✅ 索引越界编译失败

1.4 常用成员函数速查

函数功能
size()返回元素个数
at(i)带越界检查的元素访问
operator[i]不带越界检查的访问
front()返回第一个元素
back()返回最后一个元素
data()返回指向底层数组的指针
fill(x)将所有元素填充为 x
swap(other)交换两个 array 的内容

二、forward_list(前向链表)—— C++11

2.1 概述

std::forward_list是 C++11 新增的容器,底层实现采用单向链表

对比forward_listlist
链表类型单向链表双向链表
方向只能向前遍历可向前/向后遍历
内存开销每个节点只存一个指针每个节点存两个指针(next + prev)
插入/删除位置只能在指定位置之后插入可在指定位置之前或之后插入
适用场景节省内存、只需单向遍历需要双向遍历和灵活插入
forward_list: 节点 → 节点 → 节点 → end (只有 next 指针) list: 节点 ⇄ 节点 ⇄ 节点 ⇄ end (有 next 和 prev 指针)

2.2 示例代码

#include<iostream>#include<forward_list>usingnamespacestd;intmain(){forward_list<int>values{11,22,33};values.emplace_front(40);// 在头部插入 40cout<<"第一次输出结果为:"<<endl;for(autoi=values.begin();i!=values.end();i++){cout<<*i<<" ";}values.emplace_after(values.before_begin(),50);// 在头部之前插入 50cout<<"\n\n第二次输出结果为:"<<endl;for(autoi=values.begin();i!=values.end();i++){cout<<*i<<" ";}values.reverse();// 反转链表cout<<"\n\nreverse后输出结果为:"<<endl;for(autoi=values.begin();i!=values.end();i++){cout<<*i<<" ";}return0;}

2.3 执行过程分析

步骤操作链表状态
初始{11, 22, 33}11 → 22 → 33
emplace_front(40)头部插入 4040 → 11 → 22 → 33
emplace_after(before_begin(), 50)在"头部之前"插入 5050 → 40 → 11 → 22 → 33
reverse()反转链表33 → 22 → 11 → 40 → 50

before_begin()返回一个指向第一个元素之前的迭代器。因为单向链表只能向后看,要操作头部位置,需要这个"头前"迭代器。

2.4 常用成员函数速查

函数功能
emplace_front(args...)在头部原地构造元素
push_front(x)在头部插入元素
pop_front()移除头部元素
emplace_after(it, args...)在指定位置之后原地构造
insert_after(it, x)在指定位置之后插入
erase_after(it)删除指定位置之后的元素
before_begin()返回头前迭代器(用于操作第一个元素之前的位置)
reverse()反转链表
empty()/clear()判空 / 清空
sort()/merge()排序 / 合并有序链表

三、array vs forward_list 对比

特性arrayforward_list
头文件<array><forward_list>
底层结构静态数组单向链表
大小编译期固定动态增减
随机访问✅ O(1)
遍历方向双向(通过索引)单向(向前)
插入/删除复杂度❌ 不支持O(1)(指定位置之后)
内存连续性✅ 连续❌ 非连续
适用场景固定大小、需要随机访问频繁插入删除、内存敏感

http://www.jsqmd.com/news/1081560/

相关文章:

  • P89LPC910x微控制器Flash安全机制与8051指令集优化实战
  • 如何轻松实现OBS多平台直播:免费插件obs-multi-rtmp完全指南
  • 3分钟掌握知网文献批量下载:CNKI-download自动化工具完全指南
  • 33.跨平台通用!IEC61131-3 ST 电机控制源码|过载锁定 + 超时停机 + 故障码输出
  • 嵌入式RSA库控制函数详解:rsaEncControl与rsaDecControl的实战应用
  • PN7120 NFC控制器实战:从复位到读写MIFARE Classic卡全流程解析
  • layer弹窗
  • 隐私性技术中的数据保护隐私政策与合规审计
  • 从零构建结构有限元求解器:核心算法、代码实现与性能优化
  • Beyond Compare 5终极密钥生成指南:快速激活文件对比工具
  • Gofile下载器:突破限速瓶颈,让大文件下载飞起来
  • Lora远程雨量监测系统设计与低功耗优化方案
  • 国产多语言AI翻译模型技术落地指南
  • 别再赌运气!VMware免费版合法替代方案TOP5:Proxmox VE、XCP-ng、oVirt实战对比(含迁移耗时/兼容性/运维成本三维测评)
  • 如何在macOS上完美使用Xbox控制器:360Controller驱动完整指南
  • 为什么你的Cookie数据需要100%本地保护:Get cookies.txt LOCALLY解决方案
  • 假新闻识别实战:轻量模型+特征工程落地工作流
  • 嵌入式GUI窗口管理器:消息驱动、坐标系统与触摸交互实战
  • 3分钟快速找回遗忘QQ号:手机号查QQ号终极指南
  • PN7120 NFC控制器低功耗卡检测与EMVCo支付配置实战指南
  • 基于GreenPAK的低功耗RGB LED驱动方案:I2C控制与呼吸灯实现
  • 终极PPTTimer计时器指南:简单三步告别演讲超时尴尬
  • IDEA编码字符集配置失效真相(UTF-8设置被悄悄覆盖?)
  • Gemini 3.5 Flash内置Computer Use:AI Agent的
  • LPC29xx CAN控制器自测与全局验收滤波器实战解析
  • 如何告别网盘限速:LinkSwift网盘直链下载助手完整指南
  • springboot+langchain4j 实战 Day12 实现流式对话 + 打字机效果的前端聊天页面
  • 嵌入式GUI驱动开发实战:从emWin显示与触摸驱动原理到避坑指南
  • NXP PCA9629A步进电机驱动开发:I2C接口编程与OM13285开发板实战
  • 终极AMD硬件调试指南:5个技巧彻底释放Ryzen处理器性能潜力