::fast_io::array
1. 什么是 array?
::fast_io::array<T, N> 恰好存储 N 个 T 类型的元素。
大小在编译期固定,永不改变。
由于大小事先已知,array 把元素直接存储在对象自身内部。 没有动态分配,也没有大小调整。
大多数情况下你应当优先使用 ::fast_io::vector<T>,因为它会自动增长。
当大小确实固定且事先已知时,::fast_io::array 才有用。
2. 创建 array
你需要同时指定元素类型与元素个数:
#include <fast_io.h>
#include <fast_io_dsal/array.h>
int main() {
using namespace ::fast_io::iomnp;
::fast_io::array<std::size_t, 3zu> a{1zu, 2zu, 3zu};
println("a[0] = ", a[0]);
}
如果你不提供初始值,元素会被默认初始化:
::fast_io::array<std::size_t, 5zu> b{}; // all elements default-initialized
3. 访问元素
访问方式与 ::fast_io::vector 完全相同:
#include <fast_io.h>
#include <fast_io_dsal/array.h>
int main() {
using namespace ::fast_io::iomnp;
::fast_io::array<std::size_t, 4zu> a{10zu, 20zu, 30zu, 40zu};
println("Front: ", a.front()); // 10
println("Back: ", a.back()); // 40
println("Index 2: ", a[2]); // 30
}
⚠️ 安全提示:如果你使用越界索引,fast_io 会立刻调用
fast_terminate()。
安全用法
std::size_t i = 2zu;
if(i < a.size()) {
println("a[2] = ", a[i]);
}
4. 遍历元素
基于范围的 for 循环
正如字符串和 vector 一样,array 也支持基于范围的 for 循环:
for(std::size_t x : a) {
println(x);
}
索引循环
for(std::size_t i{}, n{a.size()}; i != n; ++i) {
println("Index ", i, ": ", a[i]);
}
进阶:迭代器
array 使用与第 3.1 节(string)中介绍、并在 第 4.2 节(vector)中再次使用的同一套迭代器模型。迭代器:
- 是连续的
- 支持算术运算(
+/-、[]、比较) - 使用左闭右开区间
[begin(), end())
for(auto it = a.begin(), ed = a.end(); it != ed; ++it) {
println(*it);
}
由于大小固定且永远不发生重新分配,array 的迭代器永远不会失效。
5. 工具函数
fill()
把所有元素设为同一个值:
a.fill(7zu); // all elements become 7
swap()
交换两个同大小 array 的内容:
::fast_io::array<std::size_t, 3zu> x{1zu, 2zu, 3zu};
::fast_io::array<std::size_t, 3zu> y{9zu, 8zu, 7zu};
x.swap(y);
6. 拷贝 array
::fast_io::array<T, N> 与其他可平凡复制的容器一样支持拷贝。
由于大小固定且所有元素都直接存储在对象内部,拷贝一个 array 总是会拷贝全部
N 个元素。
拷贝构造
::fast_io::array<std::size_t, 3zu> a{1zu, 2zu, 3zu};
::fast_io::array<std::size_t, 3zu> b{a}; // copy constructor
拷贝赋值
::fast_io::array<std::size_t, 3zu> a{1zu, 2zu, 3zu};
::fast_io::array<std::size_t, 3zu> b{};
b = a; // copy assignment
在不同大小的 array 之间拷贝
要拷贝,array 必须有相同的 N。下面这种写法是
编译期错误:
::fast_io::array<std::size_t, 3zu> a{};
::fast_io::array<std::size_t, 4zu> b{};
// b = a; // ❌ compile‑time error: sizes differ
用迭代器拷贝
::fast_io::array<std::size_t, 3zu> a{1zu, 2zu, 3zu};
::fast_io::array<std::size_t, 3zu> b{};
for(std::size_t i{}; i != a.size(); ++i) {
b[i] = a[i];
}
由于 array 从不重新分配,基于迭代器的拷贝始终是安全的。
要点
::fast_io::array<T, N>恰好存储N个元素,不做动态分配。- 大小在编译期固定,不能增长也不能缩小。
- 访问函数(
front()、back()、operator[])的行为与 vector 中相同。 - array 的迭代器行为与字符串、vector 的迭代器完全一致,但永不失效。
fill()与swap()提供了修改整个 array 的便捷方式。- 拷贝 array 总是拷贝全部元素;不同大小的 array 不能互相拷贝。
- 大多数任务优先使用
::fast_io::vector<T>—— 它是默认容器,并会自动增长。