std::array是 C11 引入的固定大小序列容器定义在array头文件中。它封装了传统的 C 风格数组提供了更安全、更现代的接口同时保持与 C 数组几乎相同的性能零开销抽象。下面详细介绍其特性、用法并给出一个可运行的示例。1. 基本概念模板声明cpptemplate class T, std::size_t N struct array;T元素类型。N元素个数必须是编译期常量非类型模板参数。存储元素在内存中连续存储大小固定不会动态分配。通常位于栈上若作为局部变量也可位于静态存储区或堆上若作为对象成员或动态分配。聚合类型std::array是聚合类型没有用户定义的构造函数因此可以使用花括号初始化cppstd::arrayint, 3 a {1, 2, 3}; std::arrayint, 3 b{1, 2, 3}; // C11 起大小N在编译期确定size()返回Nmax_size()也返回N。迭代器支持随机访问迭代器可用于标准算法。边界安全at()会进行边界检查越界抛出std::out_of_range异常operator[]不检查。整体操作支持赋值、比较,!,,,,、swap、fill等。与 C 数组的区别不会退化为指针但可用data()获取底层指针。有size()成员知道自身大小。可以整体赋值和比较。可以作为函数参数按值传递会拷贝整个数组。提供at()等安全访问。与std::vector的区别大小固定不能动态增删元素。无动态内存分配性能更高。不支持push_back、resize等。特殊情形N 0时std::arrayT, 0是合法的但begin() end()不能解引用。2. 常用成员函数成员说明at(pos)带边界检查的访问越界抛异常operator[](pos)无边界检查的访问front()第一个元素的引用back()最后一个元素的引用data()返回指向底层数组的指针size()返回元素个数Nmax_size()同size()empty()N 0时返回truefill(value)将所有元素设为valueswap(other)交换两个同类型array的内容begin(),end()迭代器cbegin(),cend()常量迭代器rbegin(),rend()反向迭代器非成员函数getI(arr)编译期索引访问、tuple_size、tuple_element、关系运算符、swap。#include array #include iostream #include algorithm // for std::sort int main() { // 1. 创建并初始化一个包含 5 个整数的 array std::arrayint, 5 arr {5, 2, 8, 1, 9}; // 2. 输出大小和元素 std::cout Size: arr.size() std::endl; std::cout Elements: ; for (int x : arr) { std::cout x ; } std::cout std::endl; // 3. 排序使用随机访问迭代器 std::sort(arr.begin(), arr.end()); std::cout Sorted: ; for (int x : arr) { std::cout x ; } std::cout std::endl; // 4. 使用 at() 修改元素带边界检查 arr.at(0) 100; std::cout First element: arr.front() std::endl; std::cout Last element: arr.back() std::endl; // 5. 使用 data() 获取底层指针 int* p arr.data(); std::cout Third element via pointer: p[2] std::endl; // 6. 使用 get 编译期索引访问C11 起 std::cout Element at index 1 via get: std::get1(arr) std::endl; return 0; }
阅读完成 · 觉得有帮助?