原理
std::array
是C++标准库提供的一个模板类,用于表示固定大小的数组。与传统的C风格数组不同,std::array
提供了更加安全和功能丰富的接口,并且它的大小在编译时就已经确定。std::array
实际上是对传统数组的一个轻量级封装,提供了类似于标准容器的接口。
语法
#include <array>// 定义一个包含10个整型元素的数组
std::array<int, 10> arr;// 使用初始化列表初始化数组
std::array<int, 5> arr = {1, 2, 3, 4, 5};// 访问元素
int firstElement = arr[0]; // 使用下标访问
int secondElement = arr.at(1); // 使用 at() 方法访问(带边界检查)// 获取数组的大小
std::size_t size = arr.size();// 其他成员函数
bool isEmpty = arr.empty(); // 检查数组是否为空
int front = arr.front(); // 获取第一个元素
int back = arr.back(); // 获取最后一个元素// 遍历数组
for (const auto &element : arr) {std::cout << element << " ";
}
主要成员函数
T& at(size_type n);
- 返回数组中第
n
个元素的引用,带边界检查。
- 返回数组中第
T& operator[](size_type n);
- 返回数组中第
n
个元素的引用,不带边界检查。
- 返回数组中第
T* data() noexcept;
- 返回指向数组的指针。
constexpr size_type size() const noexcept;
- 返回数组的大小。
constexpr bool empty() const noexcept;
- 检查数组是否为空。
T& front();
- 返回数组的第一个元素的引用。
T& back();
- 返回数组的最后一个元素的引用。
优点
-
类型安全
- 提供了类型安全,防止类型错误的操作。
-
边界检查
at()
方法提供了边界检查,防止越界访问。
-
接口丰富
- 提供了类似于标准容器的接口,如
size()
、empty()
、front()
、back()
等,使用更加方便。
- 提供了类似于标准容器的接口,如
-
标准库集成
- 可以与C++标准库的算法和其他容器无缝集成,支持范围
for
循环等现代C++特性。
- 可以与C++标准库的算法和其他容器无缝集成,支持范围
-
常量时间复杂度
- 由于
std::array
的大小是固定的,许多操作都可以在常量时间内完成。
- 由于
缺点
-
固定大小
- 数组的大小在编译时就已经确定,不能在运行时动态调整大小,这在某些情况下会不太灵活。
-
额外的头文件依赖
- 需要包含
<array>
头文件。
- 需要包含
-
不支持动态分配
- 由于其固定大小的特性,
std::array
不能像std::vector
一样支持动态分配和自动扩展。
- 由于其固定大小的特性,
总结
std::array
提供了一种安全、方便和功能丰富的方式来替代传统的C风格数组。它提供了类型安全、边界检查和与标准库的良好集成,但其固定大小的特性也限制了它在某些需要动态调整大小的应用场景中的使用。在需要固定大小数组的情况下,std::array
是一个非常优秀的选择。
代码