《C++ array类》
1. 基本概念与特性
固定大小:std::array
的大小在编译时确定,无法动态调整(与 std::vector
不同)。
栈分配:内存分配在栈上(除非作为类成员或通过动态分配),访问速度快。(当然也可以直接定义成全局变量)
与原生数组的对比:
- 支持迭代器、范围循环、STL 算法等。
- 提供边界检查(如
at()
方法)。 - 直接支持拷贝、赋值等操作。
2. 函数调用
(1) 声明与初始化
#include <array> #include <iostream> int main() { std::array<int, 3> arr1; // 默认初始化(值未定义) std::array<int, 3> arr2 = {1, 2, 3}; // 列表初始化 std::array<int, 3> arr3{4, 5, 6}; // C++11 统一初始化 std::array<std::string, 2> arr4 = {"hello", "world"}; // 支持自定义类型 // 访问元素 std::cout << arr2[1] << std::endl; // 无边界检查(原生数组行为) std::cout << arr2.at(1) << std::endl; // 带边界检查(抛出 std::out_of_range) }
(2) 迭代器支持
std::array<int, 4> arr = {10, 20, 30, 40}; // 使用迭代器遍历 for (auto it = arr.begin(); it != arr.end(); ++it) { std::cout << *it << " "; } // 范围循环(C++11) for (const auto& elem : arr) { std::cout << elem << " "; }
(3) 常用成员函数
size() 返回元素数量(编译时常量) arr.size() empty() 判断是否为空 arr.empty() front() 访问第一个元素 arr.front() back() 访问最后一个元素 arr.back() data() 获取指向底层数组的指针 int* p = arr.data(); fill(val) 将所有元素设为 val arr.fill(0); swap(other) 与另一个 array 交换内容 arr1.swap(arr2);
(4) 赋值操作
单个元素赋值:
std::array<int, 3> arr; arr[0] = 10; // 通过下标赋值 arr.at(1) = 20; // 通过 at() 方法赋值(会检查边界) arr.back() = 30; // 修改最后一个元素
与数组赋值:
std::array<int, 3> arr1 = {1, 2, 3}; std::array<int, 3> arr2; // 使用 operator= 复制 arr2 = arr1; // 或通过 std::copy(需包含 <algorithm>) std::array<int, 3> arr3; std::copy(arr1.begin(), arr1.end(), arr3.begin());
与C风格数组赋值:
int c_array[] = {7, 8, 9}; // C 风格数组 std::array<int, 3> arr; // std::array 容器 // 通过 std::copy 复制 std::copy(std::begin(c_array), std::end(c_array), arr.begin()); 扩展:将array数组赋值给C风格数组 // 将 std::array 的数据复制到 C 风格数组 std::copy(arr.begin(), arr.end(), std::begin(c_array));
3. 与 STL 算法结合
#include <algorithm> #include <numeric> std::array<int, 5> arr = {3, 1, 4, 1, 5}; // 排序 std::sort(arr.begin(), arr.end()); // 结果:{1, 1, 3, 4, 5} // 求和 int sum = std::accumulate(arr.begin(), arr.end(), 0); // 结果:14 // 查找 auto it = std::find(arr.begin(), arr.end(), 3); if (it != arr.end()) { std::cout << "Found at index: " << std::distance(arr.begin(), it); }
4. 与原生数组的互操作
隐式转换:std::array
可以隐式转换为原生数组指针(通过 data()
或 &arr[0]
)。
void printArray(const int* arr, size_t size) { for (size_t i = 0; i < size; ++i) { std::cout << arr[i] << " "; } } int main() { std::array<int, 3> myArr = {1, 2, 3}; printArray(myArr.data(), myArr.size()); // 传递指针和大小 }