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::iotaint 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 是填充遞增序列的專用工具,使用簡單、效率高。
-
在需要連續整數、索引填充、快速生成排列等場景時,它是首選。
-
僅需包含 ,并保證區間非空且值類型無溢出即可。