function template
<algorithm>

std::generate_n

template <class OutputIterator, class Size, class Generator>  void generate_n (OutputIterator first, Size n, Generator gen);
template <class OutputIterator, class Size, class Generator>  OutputIterator generate_n (OutputIterator first, Size n, Generator gen);
为序列生成值(使用函数)
将序列中由 `first` 指向的 `n` 个元素赋值为由 `gen` 连续调用产生的值。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
template <class OutputIterator, class Size, class Generator>
  void generate_n ( OutputIterator first, Size n, Generator gen )
{
  while (n>0) {
    *first = gen();
    ++first; --n;
  }
}

参数

first
输出迭代器,指向序列的起始位置。该序列至少有 `n` 个元素,并且其元素类型可被赋值为 `gen` 返回值的类型。
n
要生成的值得数量。
此值不得为负。
如果为负,函数不执行任何操作。
Size 必须是(可转换为)整数类型。
gen
生成器函数,调用时不带参数,并返回某个值,该值可转换为迭代器指向的类型。
这可以是函数指针或函数对象。

返回值


一个指向序列中已生成最后一个元素之后元素的迭代器。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// generate_n example
#include <iostream>     // std::cout
#include <algorithm>    // std::generate_n

int current = 0;
int UniqueNumber () { return ++current; }

int main () {
  int myarray[9];

  std::generate_n (myarray, 9, UniqueNumber);

  std::cout << "myarray contains:";
  for (int i=0; i<9; ++i)
    std::cout << ' ' << myarray[i];
  std::cout << '\n';

  return 0;
}

可能的输出
myarray contains: 1 2 3 4 5 6 7 8 9


复杂度

线性时间复杂度(与 `n` 相关):调用 `gen` 并对每个元素执行一次赋值操作。

数据竞争

由 `first` 指向的范围的前 `n` 个对象被修改(每个对象被修改一次)。

异常

如果 `gen`、元素赋值或迭代器操作抛出异常,则此函数也抛出异常。
请注意,无效参数会导致未定义行为

另见