std::
generate
函数模板 <algorithm>
template <class ForwardIterator, class Generator>
void generate (ForwardIterator first, ForwardIterator last, Generator gen); |
用函数生成范围的值
将连续调用gen所返回的值赋给[first,last)范围内的元素。
这个函数模板的行为相当于:
template <class ForwardIterator, class Generator>
void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
{
while (first != last) {
*first = gen();
++first;
}
} |
☲ 参数
-
first, last
-
指向一个序列的初始和最终位置的前向迭代器。
使用的范围是[first,last),
它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
-
gen
-
不带参数调用的生成器函数,并返回可转换为迭代器所指向的类型的某个值。
它可以是函数指针,也可以是函数对象。
☉ 返回值
none
☣ 示例
// 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
✥ 复杂度
first1和last1之间的距离线性:调用gen并对每个元素执行赋值。
⇄ 数据竞争
范围[first,last)中的对象被修改(每个对象只被访问一次)。
☂ 异常安全性
如果任何gen、元素赋值或迭代器上的操作抛出。,则抛出。
注意,无效的参数会导致未定义的行为。
🍄 另请参阅
fill |
用值填充范围(函数模板) |
generate_n |
用函数生成范围的值(函数模板) |
for_each |
将函数应用于范围(函数模板) |