<array> 数据结构

<array> 是 C++ 标准库中的固定大小数组类模板。它提供了对 C++ 原生数组的封装,并提供了更多功能,如大小检查和 STL 容器接口。std::array 的大小在编译时确定,一旦创建,它的大小不可更改。

1. 类介绍

std::array 是一个封装原生 C++ 数组的类模板,支持与标准容器类似的操作,但其大小在编译时确定。它提供了对原生数组操作的一些额外功能,如元素访问、范围检查和迭代器支持。

1.1 基本操作

创建和初始化:

#include <iostream>
#include <array>

int main() {
    // 创建一个包含 5 个 int 元素的 std::array
    std::array<int, 5> arr1 = {1, 2, 3, 4, 5};

    // 使用默认构造函数创建
    std::array<int, 3> arr2;

    // 使用初始化列表创建
    std::array<int, 3> arr3 = {10, 20, 30};

    return 0;
}

访问元素:

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr = {1, 2, 3};

    // 使用 operator[] 访问元素
    std::cout << "First element: " << arr[0] << std::endl;

    // 使用 at() 访问元素并检查越界
    std::cout << "Second element: " << arr.at(1) << std::endl;

    // 使用 front() 和 back() 访问首尾元素
    std::cout << "First element using front(): " << arr.front() << std::endl;
    std::cout << "Last element using back(): " << arr.back() << std::endl;

    return 0;
}

修改元素:

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr = {1, 2, 3};

    // 修改元素
    arr[0] = 10;
    arr.at(1) = 20;

    // 输出修改后的数组
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

迭代和遍历:

#include <iostream>
#include <array>

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

    // 使用范围-based for 循环遍历
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

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

    return 0;
}

大小和容量:

#include <iostream>
#include <array>

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

    // 获取大小
    std::cout << "Size of array: " << arr.size() << std::endl;

    // 获取容量(对于 std::array,size() == capacity())
    std::cout << "Capacity of array: " << arr.size() << std::endl;

    // 检查是否为空
    std::cout << "Is array empty? " << (arr.empty() ? "Yes" : "No") << std::endl;

    return 0;
}

填充和交换:

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr1 = {1, 2, 3};
    std::array<int, 3> arr2 = {4, 5, 6};

    // 填充数组
    arr1.fill(10);

    // 交换两个数组
    arr1.swap(arr2);

    // 输出填充和交换后的数组
    std::cout << "Array 1 after fill and swap: ";
    for (const auto& elem : arr1) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    std::cout << "Array 2 after fill and swap: ";
    for (const auto& elem : arr2) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. 高级操作

排序和反转:

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

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

    // 排序数组
    std::sort(arr.begin(), arr.end());

    // 反转数组
    std::reverse(arr.begin(), arr.end());

    // 输出排序和反转后的数组
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

多维数组:

#include <iostream>
#include <array>

int main() {
    // 创建一个 2x3 的二维数组
    std::array<std::array<int, 3>, 2> arr = {{{1, 2, 3}, {4, 5, 6}}};

    // 输出二维数组
    for (const auto& row : arr) {
        for (const auto& elem : row) {
            std::cout << elem << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

3. 总结

<array> 提供了对固定大小数组的封装,增加了对数组操作的一些功能,如范围检查、迭代器支持和 STL 容器接口。它适用于需要固定大小和在编译时已知大小的场景。通过使用 std::array,可以获得更安全和更强大的数组操作功能。