📅  最后修改于: 2020-10-17 04:24:58             🧑  作者: Mango
C++ STL algorithm.generate()函数用于将函数对象生成的值分配给范围中的每个元素。
生成器函数由用户定义,并被连续调用以分配编号。
template
void generate (ForwardIterator first, ForwardIterator last, Generator gen);
first:一个正向迭代器,指向要分配值的范围内第一个元素的位置。
last:前向迭代器,将位置指向要分配值的范围中的最后一个元素。
gen:不带参数的函数对象,用于生成要分配给范围中每个元素的值。
没有
复杂度在[first,last)范围内是线性的。它调用gen并为每个元素执行分配。
在[first,last)范围内的对象被修改。每个对象仅被访问一次。
如果gen,元素分配或迭代器上的任何操作抛出异常,则此函数将引发异常。
请注意,无效的参数会导致未定义的行为。
让我们看一个简单的示例来演示generate()的用法:
#include
#include
#include
using namespace std;
int main() {
vector v(10);
int n = 1;
generate(v.begin(), v.end(), [&n]() {
auto t = n;
n *= 2;
return t;
} );
for_each(v.begin(), v.end(), [](int x) {
cout << x << ",";
});
return 0;
}
输出:
1,2,4,8,16,32,64,128,256,512,
让我们看另一个简单的例子:
#include
#include
#include
// Defining the generator function
int gen()
{
static int i = 0;
return ++i;
}
using namespace std;
int main()
{
int i;
// Declaring a vector of size 10
vector v1(10);
// using std::generate
std::generate(v1.begin(), v1.end(), gen);
vector::iterator i1;
for (i1 = v1.begin(); i1 != v1.end(); ++i1) {
cout << *i1 << " ";
}
return 0;
}
输出:
1 2 3 4 5 6 7 8 9 10
让我们看另一个简单的例子:
#include
#include
#include
#include
#include
int main( )
{
using namespace std;
// Assigning random values to vector integer elements
vector v1 ( 5 );
vector ::iterator Iter1;
deque deq1 ( 5 );
deque ::iterator d1_Iter;
generate ( v1.begin ( ), v1.end ( ) , rand );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Assigning random values to deque integer elements
generate ( deq1.begin ( ), deq1.end ( ) , rand );
cout << "Deque deq1 is ( " ;
for ( d1_Iter = deq1.begin( ) ; d1_Iter != deq1.end( ) ; d1_Iter++ )
cout << *d1_Iter << " ";
cout << ")." << endl;
return 0;
}
输出:
Vector v1 is ( 1804289383 846930886 1681692777 1714636915 1957747793 ).
Deque deq1 is ( 424238335 719885386 1649760492 596516649 1189641421 ).
让我们看另一个简单的例子:
#include // std::cout
#include // std::generate
#include // std::vector
#include // std::time
#include // std::rand, std::srand
using namespace std;
// function generator:
int RandomNumber () { return (rand()%100); }
// class generator:
struct c_unique {
int current;
c_unique() {current=0;}
int operator()() {return ++current;}
} UniqueNumber;
int main () {
srand ( unsigned ( std::time(0) ) );
vector myvector (8);
generate (myvector.begin(), myvector.end(), RandomNumber);
cout << "myvector contains:";
for (vector::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << ' ' << *it;
cout << '\n';
generate (myvector.begin(), myvector.end(), UniqueNumber);
cout << "myvector contains:";
for (vector::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
输出:
myvector contains: 93 16 77 25 39 52 56 19
myvector contains: 1 2 3 4 5 6 7 8