命名空间
变体
操作

std::iota

来自 cppreference.com
< cpp‎ | algorithm
 
 
算法库
受限算法和范围上的算法 (C++20)
受限算法,例如 ranges::copy, ranges::sort, ...
执行策略 (C++17)
排序和相关操作
分区操作
排序操作
二分搜索操作
(在已分区范围上)
集合操作(在已排序范围上)
合并操作(在已排序范围上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比较操作
排列操作
C 库
数值操作
未初始化内存操作
 
 
定义在头文件 <numeric>
template< class ForwardIt, class T >
void iota( ForwardIt first, ForwardIt last, T value );
(自 C++11 起)
(自 C++20 起为 constexpr)

用从 value 开始的连续递增值填充范围 [firstlast),并重复评估 ++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 应用于 vectorstd::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

[编辑] 另请参见

一个 view,它由重复递增初始值生成的序列组成
(类模板) (定制点对象)[编辑]
将给定值复制赋值到范围内的每个元素
(函数模板) [编辑]
将范围内的元素赋值为某个值
(niebloid)[编辑]
将连续函数调用的结果分配给范围中的每个元素
(函数模板) [编辑]
在范围内保存函数的结果
(niebloid)[编辑]
用起始值的连续增量填充范围
(niebloid)[编辑]