在C++里,如果需要对数组或容器做批量初始化,最原始的办法是用for循环逐个赋值,但代码冗长且容易写错。标准库<algorithm>和<numeric>提供了fill与iota,能用一行代码完成批量初始化。下面先认识这两个工具的基本能力。

一、使用fill函数批量赋相同值
fill函数位于头文件<algorithm>中,作用是将一段区间内的元素全部写成同一个值。它接受三个参数:起始迭代器、结束迭代器、待填入的值。
1. 原生数组的fill用法
对原生数组可以使用指针作为迭代器,注意结束位置是首地址加长度。
#include <algorithm>
#include <iostream>
int main() {
int arr[10];
// 将数组全部初始化为0
std::fill(arr, arr + 10, 0);
for (int i = 0; i < 10; i++) {
std::cout << arr[i] << " ";
}
return 0;
}
2. 容器的fill用法
对于std::vector等容器,直接用begin()和end()即可。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v(8);
std::fill(v.begin(), v.end(), 5); // 全部填5
for (int x : v) {
std::cout << x << " ";
}
return 0;
}
二、使用iota函数生成连续序列
iota函数定义在<numeric>头文件中,它从给定的初值开始,依次递增1填充区间,适合快速生成1到N的连续编号。
1. 用iota初始化数组为1到10
#include <numeric>
#include <iostream>
int main() {
int arr[10];
// 从1开始递增填充
std::iota(arr, arr + 10, 1);
for (int i = 0; i < 10; i++) {
std::cout << arr[i] << " ";
}
return 0;
}
2. iota配合自定义步长
iota本身只支持递增1,如果需要步长不为1,可以自己写循环或结合transform,但简单连续序列用它最方便。
三、fill与iota的选择建议
当所有元素需要相同值时,优先用fill;当需要连续递增的序号时,用iota更直观。两者都避免了手写循环,降低了越界风险。
| 场景 | 推荐函数 | 头文件 |
|---|---|---|
| 全部置0或同值 | fill | <algorithm> |
| 生成1到N序列 | iota | <numeric> |
四、常见错误提醒
- 忘记包含对应头文件,导致编译报错。
- fill的结束迭代器写成错误位置,造成越界或漏赋值。
- 把iota当成可设步长的函数,实际上它只递增1。
合理运用fill与iota,可让C++数组批量初始化变得简洁且安全。