C++ 中的静态数组 std::array

目录

1. 什么是 std::array?

2. 基本用法

3. 主要特点

4. 常用操作示例

5. 优点

1. 什么是 std::array?

std::array 是一个模板类,定义在 头文件中。它是一个固定大小的数组,封装了 C 风格数组(例如 int arr[5]),但提供了更多的功能和安全性。它的主要特点是:

  • 大小在编译时确定:不像 std::vector,std::array 的大小是固定的,无法在运行时动态改变。

  • 与 STL 兼容:它支持标准模板库(STL)的接口,例如迭代器、算法等。

  • 没有额外的内存开销:它的实现与普通数组一样高效,存储在栈上(而不是堆上)。

2. 基本用法

你需要包含 头文件来使用它。以下是一个简单的例子:

#include 
#include 

int main() {
    // 定义一个大小为5的int类型数组
    std::array arr = {1, 2, 3, 4, 5};

    // 输出数组元素
    for (int i = 0; i < arr.size(); i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 主要特点

(1) 固定大小

std::array 的大小在定义时通过模板参数指定,例如 std::array 表示一个包含 5 个 int 的数组。大小必须是编译时常量。

(2) 访问元素

  • 通过索引:使用 arr[index] 或 at(index)。

    • arr[index]:普通索引访问,不检查边界。

    • arr.at(index):带边界检查,如果越界会抛出 std::out_of_range 异常。

  • 其他方法:

    • front():返回第一个元素。

    • back():返回最后一个元素。

(3) 大小查询

  • size():返回数组元素个数。

  • empty():检查数组是否为空(对于 std::array 总是返回 false,因为大小固定)。

  • max_size():返回数组的最大可能大小(等于 size())。

(4) 初始化

  • 可以用初始化列表:std::array arr = {1, 2, 3};

  • 如果初始化的元素少于数组大小,未指定的元素会被自动初始化为默认值(例如 0 对于 int):

    std::array arr = {1, 2}; // 等价于 {1, 2, 0, 0, 0}

(5) 与 C 风格数组的对比

特性

std::array

C 风格数组(如

int arr[5]

大小是否固定

边界检查

支持(通过

at()

STL 兼容性

内存分配

栈上

栈上

是否知道自己大小

是(

size()

否(需手动跟踪)

4. 常用操作示例

以下是一些常见的操作代码:

#include 
#include 

int main() {
    // 定义并初始化
    std::array arr = {10, 20, 30, 40};

    // 访问元素
    std::cout << "第一个元素: " << arr.front() << std::endl; // 10
    std::cout << "最后一个元素: " << arr.back() << std::endl; // 40
    std::cout << "索引2的元素: " << arr[2] << std::endl;      // 30

    // 大小
    std::cout << "数组大小: " << arr.size() << std::endl;     // 4

    // 使用迭代器遍历
    std::cout << "所有元素: ";
    for (auto it = arr.begin(); it != arr.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 修改元素
    arr[1] = 50;
    std::cout << "修改后索引1: " << arr[1] << std::endl;      // 50

    return 0;
}

5. 优点

  • 安全性:提供边界检查(通过 at()),避免缓冲区溢出。

  • 现代化:与 STL 容器兼容,可以直接用于算法(如 std::sort、std::find)。

  • 高效:没有动态内存分配,性能与 C 风格数组相当。

6. 局限性

  • 固定大小:无法动态调整大小。如果你需要动态大小的数组,可以使用 std::vector。

  • 栈上分配:如果数组太大,可能导致栈溢出。

你可能感兴趣的:(C/C++,c++,算法,c语言,开发语言)