function template
<algorithm>

std::generate

template <class ForwardIterator, class Generator>  void generate (ForwardIterator first, ForwardIterator last, Generator gen);
为范围生成值(使用函数)
将 successive calls to gen 返回的值赋给范围 [first,last) 中的元素。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
template <class ForwardIterator, class Generator>
  void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
{
  while (first != last) {
    *first = gen();
    ++first;
  }
}

参数

first, last
Forward iterators 指向序列的初始和最终位置。受影响的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
gen
生成器函数,该函数在不带参数的情况下调用,并返回一个可转换为由迭代器指向的类型的某个值。
这可以是函数指针或函数对象。

返回值



示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// generate algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::generate
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// function generator:
int RandomNumber () { return (std::rand()%100); }

// class generator:
struct c_unique {
  int current;
  c_unique() {current=0;}
  int operator()() {return ++current;}
} UniqueNumber;

int main () {
  std::srand ( unsigned ( std::time(0) ) );

  std::vector<int> myvector (8);

  std::generate (myvector.begin(), myvector.end(), RandomNumber);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::generate (myvector.begin(), myvector.end(), UniqueNumber);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';
 
  return 0;
}

可能的输出
myvector contains: 57 87 76 66 85 54 17 15
myvector contains: 1 2 3 4 5 6 7 8


复杂度

firstlast 之间的 distance 线性相关:调用 gen 并为每个元素执行一次赋值。

数据竞争

范围 [first,last) 中的对象将被修改(每个对象仅被访问一次)。

异常

如果 gen、元素赋值或迭代器操作中的任何一个抛出异常,则会抛出异常。
请注意,无效参数会导致未定义行为

另见