::fast_io::array

English

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)中再次使用的同一套迭代器模型。迭代器:


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 从不重新分配,基于迭代器的拷贝始终是安全的。

要点