std::iota
std::iota 是 C++ 标准库中的一个算法,用于生成一个连续的递增序列。它定义在 <numeric> 头文件中。
函数原型
template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value);参数说明
first,last: 要填充的范围的前向迭代器value: 初始值,序列从这个值开始递增
基本用法示例
#include <iostream>
#include <vector>
#include <numeric> // 需要包含这个头文件int main() {// 1. 基本用法:从0开始填充std::vector<int> vec1(5);std::iota(vec1.begin(), vec1.end(), 0);// vec1: [0, 1, 2, 3, 4]// 2. 从其他数值开始std::vector<int> vec2(5);std::iota(vec2.begin(), vec2.end(), 10);// vec2: [10, 11, 12, 13, 14]// 3. 使用负数和浮点数std::vector<float> vec3(5);std::iota(vec3.begin(), vec3.end(), -2.5f);// vec3: [-2.5, -1.5, -0.5, 0.5, 1.5]// 4. 输出结果for (int val : vec1) std::cout << val << " ";std::cout << std::endl;for (int val : vec2) std::cout << val << " ";std::cout << std::endl;for (float val : vec3) std::cout << val << " ";std::cout << std::endl;return 0;
}更多实用示例
示例1:生成字母序列
#include <vector>
#include <numeric>
#include <iostream>int main() {std::vector<char> letters(5);std::iota(letters.begin(), letters.end(), 'A');// letters: ['A', 'B', 'C', 'D', 'E']for (char c : letters) std::cout << c << " ";std::cout << std::endl;return 0;
}示例2:填充数组的一部分
#include <iostream>
#include <vector>
#include <numeric>int main() {std::vector<int> vec(10, -1); // 初始化为-1// 只填充中间部分std::iota(vec.begin() + 2, vec.end() - 2, 100);// vec: [-1, -1, 100, 101, 102, 103, 104, -1, -1, -1]for (int val : vec) std::cout << val << " ";std::cout << std::endl;return 0;
}示例3:与其他容器配合
#include <iostream>
#include <list>
#include <numeric>
#include <array>int main() {// 用于 std::liststd::list<int> lst(5);std::iota(lst.begin(), lst.end(), 5);// lst: [5, 6, 7, 8, 9]// 用于 std::arraystd::array<int, 4> arr;std::iota(arr.begin(), arr.end(), 20);// arr: [20, 21, 22, 23]for (int val : lst) std::cout << val << " ";std::cout << std::endl;for (int val : arr) std::cout << val << " ";std::cout << std::endl;return 0;
}示例4:生成索引序列
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>int main() {std::vector<std::string> fruits = {"apple", "banana", "orange", "grape", "pear"};std::vector<size_t> indices(fruits.size());// 生成索引 0, 1, 2, 3, 4std::iota(indices.begin(), indices.end(), 0);// 使用索引访问元素for (size_t idx : indices) {std::cout << idx << ": " << fruits[idx] << std::endl;}return 0;
}示例5:与算法结合使用
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <random>int main() {std::vector<int> data(8);std::iota(data.begin(), data.end(), 1);// data: [1, 2, 3, 4, 5, 6, 7, 8]// 打乱顺序std::random_device rd;std::mt19937 g(rd());std::shuffle(data.begin(), data.end(), g);std::cout << "Shuffled: ";for (int val : data) std::cout << val << " ";std::cout << std::endl;// 重新排序std::iota(data.begin(), data.end(), 1);std::cout << "Resorted: ";for (int val : data) std::cout << val << " ";std::cout << std::endl;return 0;
}性能特点
高效:
std::iota通常比手写循环更快,因为编译器可以对其进行更好的优化安全:避免了手动索引可能出现的越界错误
清晰:代码意图明确,易于理
注意事项
确保目标范围有足够的空间
迭代器必须是前向迭代器或更强类型的迭代器
值类型必须支持
++操作符
std::iota 是生成连续序列时最简洁、最高效的方法之一,特别适合与STL算法配合使用。
