C++中std::array应用详解

在 C++ 中,std::array 是 C++11 引入的一个定长数组容器,是对 C 语言原生数组(如 int arr[10])的封装,提供了更多的容器操作接口和类型安全,属于 <array> 头文件。


1. 基本特性

特性描述
定长大小在编译时确定,不能动态改变
栈分配所有元素在栈上连续存储
支持 STL 算法可以与 std::sortstd::for_each 等配合使用
类型安全支持迭代器、边界检查等功能
拷贝赋值支持整体拷贝和赋值操作

2. 语法形式

#include <array>

std::array<类型, 大小> 数组名;

示例:

std::array<int, 5> arr = {1, 2, 3, 4, 5};

3. 常用操作函数

成员函数功能
at(i)返回第 i 个元素,带边界检查
operator[]返回第 i 个元素,不带检查
front()返回第一个元素
back()返回最后一个元素
data()返回指向底层数组的指针
size()返回元素个数
fill(value)value 填充所有元素
begin(), end()返回迭代器用于遍历
swap(other)与另一个 std::array 交换内容

4. 示例代码详解

示例 1:基本用法

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};

    std::cout << "Size: " << arr.size() << std::endl;
    std::cout << "First element: " << arr.front() << std::endl;
    std::cout << "Last element: " << arr.back() << std::endl;

    // 使用at()安全访问元素
    for (size_t i = 0; i < arr.size(); ++i)
        std::cout << "Element " << i << ": " << arr.at(i) << std::endl;

    // 修改元素
    arr[2] = 99;

    // 遍历
    for (int val : arr)
        std::cout << val << " ";
    std::cout << std::endl;

    return 0;
}

示例 2:与 STL 算法结合

#include <algorithm>
#include <array>
#include <iostream>

int main() {
    std::array<int, 6> arr = {5, 3, 8, 1, 4, 6};

    std::sort(arr.begin(), arr.end());

    for (const auto& v : arr)
        std::cout << v << " ";
    std::cout << std::endl;

    return 0;
}

示例 3:使用 fill()data()

#include <iostream>
#include <array>

int main() {
    std::array<int, 4> arr;
    arr.fill(7);

    // 输出所有元素
    for (auto x : arr)
        std::cout << x << " ";
    std::cout << std::endl;

    // 原始指针访问
    int* p = arr.data();
    p[0] = 100;
    std::cout << "First element via pointer: " << arr[0] << std::endl;

    return 0;
}

️ 注意事项

  1. 数组大小必须是编译期常量

    int n = 5;
    std::array<int, n>; // ❌ 错误:n 不是常量表达式
    
  2. 不能动态扩容或缩减
    如果需要动态大小,请使用 std::vector

  3. 初始化不足位时,未初始化部分为 0

    std::array<int, 4> arr = {1, 2};  // 等价于 {1, 2, 0, 0}
    
  4. 拷贝语义和赋值语义是值语义

    std::array<int, 3> a = {1, 2, 3};
    std::array<int, 3> b = a;  // 拷贝
    
  5. 与原生数组的主要区别:支持 STL 接口
    原生数组 int arr[5] 不支持 .size().at().begin() 等函数。


std::vector 对比

项目std::arraystd::vector
大小固定,编译期常量可变,运行时动态增长
存储位置栈内存堆内存
性能更快(无动态分配)稍慢(动态分配)
使用场景小型、高性能固定数组场景动态数据结构

总结

  • std::array<T, N> 是定长、栈分配、安全封装的数组类型;
  • 是原生数组的现代替代品,适合 性能敏感且长度固定 的应用场景;
  • 使用 STL 算法、迭代器、at() 安全访问等方式更加方便和安全;
  • 不能替代 std::vector 用于动态扩容场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云SLAM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值