std::array 静态数组

(C++11引入的固定大小数组)

std::array是 C++标准库中的一个容器,它提供了固定大小的数组,具有以下特点:

一、优点

  1. 类型安全:与传统的 C 风格数组不同,std::array是一个类型安全的容器,它知道自己的大小和元素类型。

  2. 边界检查:可以通过at()成员函数进行边界检查,在访问元素时如果越界会抛出异常,增加了程序的安全性。

  3. 支持迭代器:可以像其他标准容器一样使用迭代器进行遍历。

  4. 可以直接传递给函数:不像 C 风格数组在传递给函数时会退化为指针,std::array可以直接作为参数传递给函数,保留了大小信息。

  5. 与算法良好配合:可以直接使用标准算法库中的算法,无需进行特殊处理。

二、基本用法

  1. 定义和初始化

    std::array<int, 5> arr1 = {1, 2, 3, 4, 5};
    std::array<int, 5> arr2{6, 7, 8, 9, 10};
  2. 访问元素

    int firstElement = arr1[0];
    int secondElement = arr1.at(1);
  3. 获取大小

    std::size_t size = arr1.size();
  4. 遍历

    for (auto it = arr1.begin(); it!= arr1.end(); ++it) {
        std::cout << *it << " ";
    }
  5. 比较

    bool isEqual = (arr1 == arr2);
    bool isNotEqual = (arr1!= arr2);
    bool lessThan = (arr1 < arr2);
    // 等等其他比较操作

三、与其他容器和传统数组的转换

  1. 转换为 C 风格数组:

    int* cStyleArray = arr1.data();
  2. 转换为std::vector

    std::vector<int> vec(arr1.begin(), arr1.end());

四、属性和方法

一、属性

  1. 固定大小:在编译时确定大小,不能动态改变大小。

  2. 存储在栈上或静态存储区:与std::vector不同,std::array通常存储在栈上或静态存储区,这可以提供更好的性能和内存局部性。

  3. 类型安全:明确指定元素类型,避免了类型不匹配的错误。

二、方法

  1. 构造函数

    • array():默认构造函数,创建一个空的std::array

    • array( const T& value ):创建一个所有元素都初始化为给定值的std::array

    • array( const std::array<T,N>& other ):复制构造函数,从另一个std::array创建新的std::array

    • array( std::array<T,N>&& other ):移动构造函数,从另一个std::array移动创建新的std::array

    • array( std::initializer_list<T> init ):使用初始化列表创建std::array

  2. 元素访问

    • at( size_type pos ):返回指定位置的元素引用,进行边界检查,如果访问越界会抛出异常。

    • operator[]( size_type pos ):返回指定位置的元素引用,不进行边界检查,速度较快但不安全。

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

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

    • data():返回指向数组首元素的指针,可以用于与 C 风格的函数交互。

  3. 容量相关

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

    • max_size():返回数组能容纳的最大元素个数,与size()返回值相同。

    • empty():判断数组是否为空,对于std::array总是返回false,因为它总是有元素。

  4. 迭代器相关

    • begin():返回指向数组首元素的迭代器。

    • end():返回指向数组尾元素后一个位置的迭代器。

    • cbegin():返回指向数组首元素的常量迭代器。

    • cend():返回指向数组尾元素后一个位置的常量迭代器。

    • rbegin():返回指向数组尾元素的反向迭代器。

    • rend():返回指向数组首元素前一个位置的反向迭代器。

    • crbegin():返回指向数组尾元素的常量反向迭代器。

    • crend():返回指向数组首元素前一个位置的常量反向迭代器。

  5. 填充和交换

    • fill( const T& value ):将数组中的所有元素设置为给定值。

    • swap( array& other ):交换两个std::array的内容。

五、应用场景

  1. 需要固定大小数组且希望有更好的类型安全和功能支持时。

  2. 与其他标准库组件(如算法、迭代器等)配合使用时。

  3. 在需要传递数组给函数且希望保留大小信息时。

小结:

1、替代我们固定数组的结构

2、作为参数传递的时候,不用传长度,不用模板,可以保留大小信息。

3、很好结合了迭代器

Last updated