std::iota 是标准库算法,用于向已分配空间的容器中按递增1规则填充连续整数;它不创建容器、不分配内存,仅作用于给定的左闭右开迭代器区间,要求随机访问迭代器且类型兼容。

std::iota 是什么,它填什么
它不创建容器,也不分配内存,只按规则往已有迭代器范围内“写数字”:从指定初值开始,每次加 1,依次赋给每个位置。所以你得先有空间——比如 std::vector、std::array 或裸数组。
最简可用写法(C++11 起)
必须包含 <numeric>,且传入左闭右开区间(和 STL 大部分算法一致):
#include <vector>
#include <numeric>
#include <iostream>
std::vector<int> v(5);
std::iota(v.begin(), v.end(), 0); // 填成 {0,1,2,3,4}
注意:v 必须已分配好大小,否则 v.begin() 和 v.end() 指向无效地址,行为未定义。
常见踩坑点
- 用在空容器上:如
std::vector<int> v; 后直接调 std::iota(v.begin(), v.end(), 0) —— 不报错但无效果,因为区间长度为 0
- 类型不匹配:初值类型必须能隐式转为目标元素类型。比如对
std::vector<unsigned char> 传 1000,会截断,但编译器通常不警告
- 误以为支持自定义步长:它只加 1,不是
std::iota 的错,是设计如此。要等差数列得手写循环或用 std::generate + lambda
- 迭代器失效风险:若填充目标是
std::list,不能用 std::iota —— 它要求随机访问迭代器(RandomAccessIterator),std::list::iterator 不满足
替代方案:当 std::iota 不够用时
std::vector<int> v; 后直接调 std::iota(v.begin(), v.end(), 0) —— 不报错但无效果,因为区间长度为 0std::vector<unsigned char> 传 1000,会截断,但编译器通常不警告std::iota 的错,是设计如此。要等差数列得手写循环或用 std::generate + lambdastd::list,不能用 std::iota —— 它要求随机访问迭代器(RandomAccessIterator),std::list::iterator 不满足比如你要填 {10, 20, 30, 40},步长为 10,就得换方式:
立即学习“C++免费学习笔记(深入)”;
std::vector<int> v(4);
int val = 10;
std::generate(v.begin(), v.end(), [&](){ int r = val; val += 10; return r; });
或者更直白地用 for 循环——尤其当你需要条件跳过、边界校验或调试输出时,别硬套 std::iota。
它的价值在于简洁和意图明确,不是万能填充工具。真正容易被忽略的是:它不检查目标是否可写,也不做越界防护,全靠你保证迭代器合法、空间足够、类型安全。


















