.\" ident @(#)generate.3 .\" Standard Template Library .\" $$RW_INSERT_HEADER "slyrs.man" .TH generate 3C++ "02 Apr 1998" "Rogue Wave Software" "-" .ce2 Standard C++ Library Copyright 1998, Rogue Wave Software, Inc. .SH NAME \f2generate\fP, \f2generate_n\fP \ - Initialize a container with values produced by a value-generator class. .SH SYNOPSIS .RE .RS 0 #include .br .br template .RE .RS 1 void generate(ForwardIterator first, ForwardIterator last, .RE .RS 15 Generator gen); .RE .RS 0 .br template .RE .RS 1 void generate_n(OutputIterator first, Size n, Generator gen); .SH DESCRIPTION A value-generator function returns a value each time it is invoked. The algorithms generate and generate_n initialize (or reinitialize) a sequence by assigning the return value of the generator function \f2gen\fP to all the elements designated by iterators in the range \f2[first, last)\fP or \f2[first, first + n)\fP. The function \f2gen\fP takes no arguments. (\f2gen\fP can be a function or a class with an \f2operator ()\fP defined that takes no arguments.) generate_n assumes that there are at least \f2n\fP elements following \f2first\fP, unless \f2first\fP is an insert iterator. .SH COMPLEXITY The generate and generate_n algorithms invoke \f2gen \fPand assign its return value exactly\f2 last - first \fP(or \f2n\fP) times. .SH EXAMPLE .RE .RS 0 // .br // generate.cpp .br // .RE .RS 1 #include .br #include .br #include .RE .RS 0 using namespace std; .br .RE .RS 1 // Value generator simply doubles the current value .br // and returns it .RE .RS 0 template .br class generate_val .RE .RS 1 { .RE .RS 2 private: .RE .RS 5 T val_; .RE .RS 2 public: .RE .RS 5 generate_val(const T& val) : val_(val) {} .br T& operator()() { val_ += val_; return val_; } .RE .RS 1 }; .RE .RS 0 .br int main() .RE .RS 1 { .RE .RS 2 int d1[4] = {1,2,3,4}; .br generate_val gen(1); .RE .RS 0 .RE .RS 3 // Set up two vectors .RE .RS 2 vector v1(d1,d1 + 4), v2(d1,d1 + 4); .RE .RS 3 // Set up one empty vector .RE .RS 2 vector v3; .RE .RS 0 .RE .RS 3 // Generate values for all of v1 .br generate(v1.begin(),v1.end(),gen); .RE .RS 0 .RE .RS 3 // Generate values for first 3 of v2 .br generate_n(v2.begin(),3,gen); .RE .RS 0 .RE .RS 3 // Use insert iterator to generate 5 values for v3 .br generate_n(back_inserter(v3),5,gen); .RE .RS 0 .RE .RS 3 // Copy all three to cout .RE .RS 2 ostream_iterator out(cout," "); .br copy(v1.begin(),v1.end(),out); .br cout << endl; .br copy(v2.begin(),v2.end(),out); .br cout << endl; .br copy(v3.begin(),v3.end(),out); .br cout << endl; .RE .RS 0 .RE .RS 3 // Generate 3 values for cout .br generate_n(ostream_iterator(cout," "),3,gen); .RE .RS 2 cout << endl; .RE .RS 0 .RE .RS 2 return 0; .RE .RS 1 } .br .RE .RS 0 Program Output .RE .RS 0 .br 2 4 8 16 .br 2 4 8 4 .br 2 4 8 16 32 .br 2 4 8 .SH WARNINGS If your compiler does not support default template parameters, then you always need to supply the \f2Allocator\fP template argument. For instance, you have to write: \f2vector >\fP instead of: \f2vector\fP If your compiler does not support namespaces, then you do not need the using declaration for \f2std\fP. .SH SEE ALSO Function_Objects