std::iota
来自 cppreference.cn
定义于头文件 <numeric> |
||
template< class ForwardIt, class T > void iota( ForwardIt first, ForwardIt last, T value ); |
(since C++11) (constexpr since C++20) |
|
使用从 value 开始并重复求值 ++value 的顺序递增值填充范围 [
first,
last)
。
等效操作(假设 ++value 返回递增后的值)
*first = value; *++first = ++value; *++first = ++value; *++first = ++value; // repeats until “last” is reached
如果满足以下任何条件,则程序是非良构的
-
T
不可转换为ForwardIt
的值类型。 - 表达式 ++val 是非良构的,其中 val 是
T
类型的变量。
目录 |
[编辑] 参数
first, last | - | 定义要用从 value 开始的顺序递增值填充的元素范围的迭代器对 |
value | - | 要存储的初始值 |
[编辑] 复杂度
恰好 std::distance(first, last) 次递增和赋值。
[编辑] 可能的实现
template<class ForwardIt, class T> constexpr // since C++20 void iota(ForwardIt first, ForwardIt last, T value) { for (; first != last; ++first, ++value) *first = value; } |
[编辑] 注解
此函数以编程语言 APL 中的整数函数 ⍳ 命名。它是 C++98 中未包含的 STL 组件 之一,但在 C++11 中进入了标准库。
[编辑] 示例
以下示例将 std::shuffle 应用于 vector 的 std::list 的迭代器。 std::iota
用于填充容器。
运行此代码
#include <algorithm> #include <iomanip> #include <iostream> #include <list> #include <numeric> #include <random> #include <vector> class BigData // inefficient to copy { int data[1024]; /* some raw data */ public: explicit BigData(int i = 0) { data[0] = i; /* ... */ } operator int() const { return data[0]; } BigData& operator=(int i) { data[0] = i; return *this; } /* ... */ }; int main() { std::list<BigData> l(10); std::iota(l.begin(), l.end(), -4); std::vector<std::list<BigData>::iterator> v(l.size()); std::iota(v.begin(), v.end(), l.begin()); // Vector of iterators (to original data) is used to avoid expensive copying, // and because std::shuffle (below) cannot be applied to a std::list directly. std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()}); std::cout << "Original contents of the list l:\t"; for (const auto& n : l) std::cout << std::setw(2) << n << ' '; std::cout << '\n'; std::cout << "Contents of l, viewed via shuffled v:\t"; for (const auto i : v) std::cout << std::setw(2) << *i << ' '; std::cout << '\n'; }
可能的输出
Original contents of the list l: -4 -3 -2 -1 0 1 2 3 4 5 Contents of l, viewed via shuffled v: -1 5 -4 0 2 1 4 -2 3 -3
[编辑] 参见
(C++20) |
一个 view ,由通过重复递增初始值生成的序列组成(类模板) (自定义点对象) |
将给定值复制赋值给范围中的每个元素 (函数模板) | |
(C++20) |
为某个范围的元素赋值 (算法函数对象) |
将连续函数调用的结果赋值给范围中的每个元素 (函数模板) | |
(C++20) |
将函数的结果保存在范围中 (算法函数对象) |
(C++23) |
用起始值的连续增量填充范围 (算法函数对象) |