std::iota
- 1. 概述
- 2. 函数原型
- 3. 使用示例
- 示例 1:填充 vector<int>
- 示例 2:从非零起始值开始
- 4. 应用场景
- 5. 注意事项
- 6. 与其它算法比较
- 小结
1. 概述
-
std::iota 定义在头文件 中,C++11 起引入。
-
它用于向前迭代器区间依次填入连续递增的数值。
-
常用于一次性将容器初始化为 0,1,2,… 或从任意起始值开始的连续整数序列。
2. 函数原型
namespace std {
template< class ForwardIt, class T >
void iota(ForwardIt first, ForwardIt last, T value);
}
模板参数 | 说明 |
---|---|
ForwardIt | 必须满足 ForwardIterator,即支持多次遍历的迭代器类型 |
T | 可拷贝、可递增(使用 ++ 运算符)的值类型 |
-
参数
-
first, last:给定的迭代器区间 [first, last)。
-
value:起始值,第一个位置赋 value,之后不断 ++value。
-
-
返回类型
- void,不返回任何值。
-
时间复杂度
- 线性:执行次数等于区间长度 N = std::distance(first, last),共做 N 次赋值操作。
3. 使用示例
示例 1:填充 vector
#include <iostream>
#include <vector>
#include <numeric> // for std::iota
int main() {
int N = 10;
std::vector<int> v(N);
std::iota(v.begin(), v.end(), 0); // v = {0,1,2,...,9}
for (int x : v) std::cout << x << ' ';
// 输出:0 1 2 3 4 5 6 7 8 9
}
示例 2:从非零起始值开始
#include <deque>
#include <numeric>
std::deque<long> dq(5);
std::iota(dq.begin(), dq.end(), 100L);
// dq = {100,101,102,103,104}
4. 应用场景
-
容器初始化
快速生成固定模式的数据:索引序列、ID 列表、测试用例等。 -
排列生成
先 iota 填充再对区间 shuffle,可快速生成随机排列。 -
与算法结合
与 std::sort、std::unique 等配合,用于排序检测、差分计算等场景。
5. 注意事项
-
溢出风险
如果 T 是整型且区间过长,连续递增可能导致溢出。建议保证 value + (last-first -1) 在类型范围内。 -
迭代器要求
必须至少满足 ForwardIterator:随机访问迭代器、单向链表迭代器等都可以。 -
类型转换
如果 T 与容器元素类型不一致,会发生隐式转换;最好保持一致或显式转换以避免警告。 -
C++20 Ranges
C++20 引入了 std::views::iota,可生成惰性(lazy)序列视图:#include <ranges> auto view = std::views::iota(5, 10); // 表示 5,6,7,8,9
6. 与其它算法比较
算法 | 优势 | 劣势 |
---|---|---|
std::iota | 专门生成递增序列、语义直观 | 只能递增 ++ ,不支持其它模式 |
std::generate | 可自定义生成逻辑(函数/lambda) | 代码相对冗长 |
std::generate_n | 同上,可限制生成次数 | 同上 |
小结
-
std::iota 是填充递增序列的专用工具,使用简单、效率高。
-
在需要连续整数、索引填充、快速生成排列等场景时,它是首选。
-
仅需包含 ,并保证区间非空且值类型无溢出即可。