Library: Algorithms
Function
Algorithm that assigns each element in a range a value produced by repeated application of the given function object
#include <algorithm>
namespace std {
template <class ForwardIterator, class Generator>
void generate(ForwardIterator start, ForwardIterator finish,
Generator gen);
template <class OutputIterator, class Size, class Generator>
void generate_n(OutputIterator start, Size n,
Generator gen);
}
A value-generator function returns a value each time it is invoked. The algorithms generate() and generate_n() assign each element in the sequence [start, finish) or [start, start + n) the return value of the generator function gen(). The function gen() takes no arguments. (gen() can be a function or a class with an operator() defined that takes no arguments.)
generate_n() assumes that all iterators in the range [start, start + n] are dereferenceable, unless start is an insert iterator.
The generate() and generate_n() algorithms invoke gen() and assign its return value exactly finish - start (or n) times.
//
// generate.cpp
//
#include <algorithm> // for generate, generate_n
#include <iostream> // for cout, endl
#include <vector> // for vector
// Value generator simply doubles the current value
// and returns it.
template <class T>
class generator
{
T val_;
public:
generator(const T &val) : val_ (val) { }
T operator()() {
return val_ += val_;
}
};
int main ()
{
// Typedef for convenience.
typedef std::vector<short,
std::allocator<short> > vector;
vector::value_type arr[4] = { 1, 2, 3, 4 };
// Set up two vectors.
vector v1(arr, arr + sizeof arr / sizeof *arr);
vector v2 = v1;
// Set up one empty vector.
vector v3;
// Create a generator function object.
generator<vector::value_type> gen(1);
// Generate values for all of v1.
std::generate(v1.begin(), v1.end(), gen);
// Generate values for first 3 of v2.
std::generate_n(v2.begin(), 3, gen);
// Use back_insert_iterator to generate 5 values for v3.
std::generate_n(std::back_inserter(v3), 5, gen);
// Copy all three to cout.
std::ostream_iterator<vector::value_type, char,
std::char_traits<char> > out(std::cout, " ");
std::copy(v1.begin(), v1.end(), out);
std::cout << std::endl;
std::copy(v2.begin(), v2.end(), out);
std::cout << std::endl;
std::copy(v3.begin(), v3.end(), out);
std::cout << std::endl;
// Generate 3 values into cout.
std::generate_n(out, 3, gen);
std::cout << std::endl;
return 0;
}
Program Output:
2 4 8 16 2 4 8 4 2 4 8 16 32 2 4 8
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 25.2.6