fork(2) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. template <class F>
  8. class generator{
  9. public:
  10. //typedefs required for iterator-use
  11. typedef typename F::value_type value_type;
  12. typedef typename F::step_type step_type;
  13. typedef value_type * pointer;
  14. typedef value_type & reference;
  15. typedef typename F::size_type size_type;
  16. typedef typename F::difference_type difference_type;
  17. typedef std::bidirectional_iterator_tag iterator_category;
  18.  
  19. generator(value_type init, step_type step) : t(init), step(step){}
  20.  
  21. generator<F> &operator++() {
  22. t += step; return *this;
  23. }
  24.  
  25. generator<F> &
  26. operator+=(size_type n)
  27. {
  28. t += n * step;
  29. return *this;
  30. }
  31.  
  32. generator<F>
  33. operator+(size_type n)
  34. {
  35. return generator(*this) += n;
  36. }
  37.  
  38. value_type operator*() const {
  39. return f(t);
  40. }
  41.  
  42. friend bool operator==(const generator<F> &lhs, const generator<F> &rhs){
  43. return lhs.t == rhs.t;
  44. }
  45. friend bool operator!=(const generator<F> &lhs, const generator<F> &rhs){
  46. return !(lhs == rhs);
  47. }
  48. private:
  49. value_type t;
  50. value_type step;
  51. F f;
  52. };
  53.  
  54. template <typename T>
  55. struct simple_generator_function
  56. {
  57. typedef T value_type;
  58. typedef T step_type;
  59. typedef T difference_type;
  60. typedef size_t size_type;
  61. };
  62.  
  63. template <typename T>
  64. struct square_generator : public simple_generator_function<T> {
  65.  
  66. T operator()(T t) const{
  67. return t * t;
  68. }
  69. };
  70.  
  71.  
  72. int main(void) {
  73. using int_sqg = generator<square_generator<int>>;
  74. int_sqg gen(1, 1);
  75. vector<int> v(gen, gen+10);
  76. copy(begin(v), end(v), ostream_iterator<int>(cout, ","));
  77. cout << '\n';
  78. }
Success #stdin #stdout 0s 3272KB
stdin
Standard input is empty
stdout
1,4,9,16,25,36,49,64,81,100,