通八洲科技

c++中如何使用std::iota填充序列_c++生成连续数值方法

日期:2026-01-02 00:00 / 作者:尼克
std::iota用于填充连续递增序列,需预先分配内存,接受起始/结束迭代器和初值,要求类型支持前置自增与赋值,适用于vector、array及原生数组,但不检查越界、无步长控制且非线程安全。

std::iota 填充数组或容器的正确用法

直接用 std::iota 填充连续整数最简单,但它不自动分配内存,只负责“写入”,所以必须确保目标容器已就绪且可写。

std::iota 填充 std::vector 的典型写法

很多人卡在 vector 没预分配空间就调用 iota,结果写入到空容器的 begin() 导致崩溃。必须先 resize 或 reserve + assign。

std::vector v(10);  // 必须先构造出 10 个元素
std::iota(v.begin(), v.end(), 0);  // 填入 0,1,2,...,9

如果想从 100 开始:把第三个参数换成 100;如果填 long long,第三个参数也得是 long long,否则可能隐式截断。

用 std::iota 填充原生数组或 std::array

原生数组不能直接用 std::size()(C++17 起才有),容易传错长度;std::array 更安全,因为 arr.size() 是 constexpr。

int arr[5];
std::iota(std::begin(arr), std::end(arr), 1);  // 填入 1,2,3,4,5

std::array a;
std::iota(a.begin(), a.end(), 0.5);  // 填入 0.5,1.5,2.5,3.5

注意:std::iota 对浮点类型也有效,但浮点累加可能存在精度误差(比如填 0.1 步长时第 10 项未必精确等于 1.0)。

std::iota 和 for 循环比,有什么坑

性能上基本没差别,现代编译器都能优化成同样汇编;但语义和安全性差异明显:

真正容易被忽略的是:它不检查目标是否可写,也不关心类型是否支持赋值——只要 *it = value 合法,它就执行,哪怕 value 是 const 或临时对象。