c++ array使用笔记
- 1. 构造
- 2. 成员类型
- 3. 元素访问
- 4. 容量相关
- 5. 填充与交换
- 6. 比较操作
- 7. 迭代器
- 总结
array 是 C++ 标准库中的一个容器模板,它封装了一个固定长度的内建数组,并提供了类似于其他 STL 容器的接口。与内建数组相比,
array 提供了更多的操作,如复制、比较、交换等。以下是
array 容器的主要接口及其功能的简要介绍:
1. 构造
- 默认构造函数:创建一个空的
array对象。 - 初始化列表构造函数:允许使用初始化列表来初始化
array中的元素。
std::array<int, 3> arr1; // 默认构造,元素未初始化
std::array<int, 3> arr2 = {1, 2, 3}; // 使用初始化列表构造
2. 成员类型
value_type:array中元素的类型。size_type:表示array大小的无符号整数类型。iterator和const_iterator:用于遍历array的迭代器类型。reference和const_reference:元素的引用类型。
std::array<int, 3>::value_type x = 10; // x 的类型是 int
3. 元素访问
operator[]:通过下标访问元素,不进行边界检查。at():通过下标访问元素,进行边界检查,如果越界则抛出std::out_of_range异常。front():访问第一个元素。back():访问最后一个元素。data():返回指向底层数组的指针。
std::array<int, 3> arr = {1, 2, 3};
int x = arr[0]; // 访问第一个元素
int y = arr.at(1); // 访问第二个元素,带边界检查
int z = arr.front(); // 访问第一个元素
int w = arr.back(); // 访问最后一个元素
int* p = arr.data(); // 获取底层数组的指针
4. 容量相关
empty():检查array是否为空(对于array,只有在大小为 0 时才为空)。size():返回array中元素的数量。max_size():返回array可以容纳的最大元素数量(对于array,size()和max_size()通常相同)。
std::array<int, 3> arr = {1, 2, 3};
bool isEmpty = arr.empty(); // false
std::size_t size = arr.size(); // 3
std::size_t maxSize = arr.max_size(); // 3
5. 填充与交换
fill(value):将array中的所有元素设置为指定的值。swap(other):交换两个array的内容。
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
arr1.fill(0); // arr1 变为 {0, 0, 0}
arr1.swap(arr2); // arr1 变为 {4, 5, 6}, arr2 变为 {0, 0, 0}
6. 比较操作
operator<=>(C++20 引入):用于比较两个array对象的元素。返回一个比较结果,可以是std::strong_ordering、std::weak_ordering或std::partial_ordering。
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {1, 2, 4};
auto result = (arr1 <=> arr2); // 返回 std::strong_ordering::less
7. 迭代器
begin()和end():返回指向array第一个元素和最后一个元素之后位置的迭代器。cbegin()和cend():返回指向array第一个元素和最后一个元素之后位置的常量迭代器。rbegin()和rend():返回指向array最后一个元素和第一个元素之前位置的逆向迭代器。crbegin()和crend():返回指向array最后一个元素和第一个元素之前位置的常量逆向迭代器。
std::array<int, 3> arr = {1, 2, 3};
for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout << *it << " "; // 输出 1 2 3
}
总结
array 是一个固定大小的容器,提供了类似于内建数组的功能,但增加了更多的操作和安全性(如边界检查)。它适用于需要固定大小数组且希望使用 STL 风格的接口的场景。
