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、元素賦值或迭代器操作中的任何一個丟擲異常,則會丟擲異常。
請注意,無效引數會導致未定義行為

另見