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

std::iota 填充数组或容器的正确用法
直接用 std::iota 填充连续整数最简单,但它不自动分配内存,只负责“写入”,所以必须确保目标容器已就绪且可写。
- 头文件是
,不是或 - 第一个参数是起始迭代器(
begin),第二个是结束迭代器(end),第三个是起始值(value) - 它按
++value方式递增填充,因此要求value类型支持前置自增 - 对
std::array、std::vector、原生数组都适用,但必须保证区间有效——越界不会报错,只会导致未定义行为
std::iota 填充 std::vector 的典型写法
很多人卡在 vector 没预分配空间就调用 iota,结果写入到空容器的 begin() 导致崩溃。必须先 resize 或 reserve + assign。
std::vectorv(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。
立即学习“C++免费学习笔记(深入)”;
int arr[5]; std::iota(std::begin(arr), std::end(arr), 1); // 填入 1,2,3,4,5 std::arraya; 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 循环比,有什么坑
性能上基本没差别,现代编译器都能优化成同样汇编;但语义和安全性差异明显:
- 循环手写容易写成
i 导致越界,iota只依赖迭代器范围,更贴近容器本意 -
iota不支持步长(step)——它永远是 +1,要等差序列得自己写循环或用std::transform+ lambda - 多线程下不能直接对同一容器并发调用
iota,它不是线程安全的 - 如果容器元素类型重载了
operator++但行为异常(比如每次加 3),iota就会悄悄偏离预期
真正容易被忽略的是:它不检查目标是否可写,也不关心类型是否支持赋值——只要 *it = value 合法,它就执行,哪怕 value 是 const 或临时对象。











