std::iota
来自 cppreference.com
定义在头文件 <numeric> 中 |
||
template< class ForwardIt, class T > void iota( ForwardIt first, ForwardIt last, T value ); |
(自 C++11 起) (自 C++20 起为 constexpr) |
|
用从 value 开始的连续递增值填充范围 [
first,
last)
,并重复评估 ++value.
等效操作(假设 ++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 中的整数函数 ⍳ 命名。它是 STL 组件 之一,未包含在 C++98 中,但已在 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) |
将范围内的元素赋值为某个值 (niebloid) |
将连续函数调用的结果分配给范围中的每个元素 (函数模板) | |
(C++20) |
在范围内保存函数的结果 (niebloid) |
(C++23) |
用起始值的连续增量填充范围 (niebloid) |