C++ 标准特性:array forward_list
C 标准特性array forward_list一、arraySTL array 容器—— C111.1 概述std::array是 C11 标准中新增的序列容器它封装了固定大小的 C 风格数组。特性说明头文件array大小编译期确定不可动态改变底层封装 C 风格数组优势比原生数组更安全支持迭代器和 STL 算法与vector的区别vector大小可变array大小固定array性能更接近原生数组1.2 示例代码#includeiostream#includearray// array容器usingnamespacestd;intmain(){std::arrayint,5arr{};// 初始化arr容器for(inti1;iarr.size();i){arr.at(i)i;}// 通过get()重载函数输出指定位置元素值cout输出结果为get4(arr)endl;return0;}1.3 代码解析arrayint,5arr{};// 创建 int 类型、大小为 5 的 array初始值为 0arr.at(i)i;// 带越界检查的访问越界时抛 std::out_of_rangearr[i]i;// 另一种访问方式不检查越界性能更高get4(arr);// 编译期索引访问索引越界会在编译时报错访问方式检查时机安全性arr[i]无检查⚠️ 越界未定义行为arr.at(i)运行时检查✅ 越界抛异常getN(arr)编译期检查✅✅ 索引越界编译失败1.4 常用成员函数速查函数功能size()返回元素个数at(i)带越界检查的元素访问operator[i]不带越界检查的访问front()返回第一个元素back()返回最后一个元素data()返回指向底层数组的指针fill(x)将所有元素填充为 xswap(other)交换两个 array 的内容二、forward_list前向链表—— C112.1 概述std::forward_list是 C11 新增的容器底层实现采用单向链表。对比forward_listlist链表类型单向链表双向链表方向只能向前遍历可向前/向后遍历内存开销每个节点只存一个指针每个节点存两个指针next prev插入/删除位置只能在指定位置之后插入可在指定位置之前或之后插入适用场景节省内存、只需单向遍历需要双向遍历和灵活插入forward_list: 节点 → 节点 → 节点 → end (只有 next 指针) list: 节点 ⇄ 节点 ⇄ 节点 ⇄ end (有 next 和 prev 指针)2.2 示例代码#includeiostream#includeforward_listusingnamespacestd;intmain(){forward_listintvalues{11,22,33};values.emplace_front(40);// 在头部插入 40cout第一次输出结果为:endl;for(autoivalues.begin();i!values.end();i){cout*i ;}values.emplace_after(values.before_begin(),50);// 在头部之前插入 50cout\n\n第二次输出结果为:endl;for(autoivalues.begin();i!values.end();i){cout*i ;}values.reverse();// 反转链表cout\n\nreverse后输出结果为:endl;for(autoivalues.begin();i!values.end();i){cout*i ;}return0;}2.3 执行过程分析步骤操作链表状态初始{11, 22, 33}11 → 22 → 33emplace_front(40)头部插入 4040 → 11 → 22 → 33emplace_after(before_begin(), 50)在头部之前插入 5050 → 40 → 11 → 22 → 33reverse()反转链表33 → 22 → 11 → 40 → 50before_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头文件arrayforward_list底层结构静态数组单向链表大小编译期固定动态增减随机访问✅ O(1)❌遍历方向双向通过索引单向向前插入/删除复杂度❌ 不支持O(1)指定位置之后内存连续性✅ 连续❌ 非连续适用场景固定大小、需要随机访问频繁插入删除、内存敏感