|     | iterators/inserters/ins-2.cpp - Output insert-iterators and factory functions that create such iterators. | Lecture 6 - slide 6 : 40 Program 1 | 
// Demonstration of output iterators and inserters (C++11, due to >> in template notation, and not > >).
#include <iostream>
#include <string>
#include <vector>
#include <list>
template <typename CONT> void print_seq(const CONT &v);
int main(){
  using namespace std;
  // Make and initialize a vector:
  vector<double> vd;
  for(int i = 1; i <= 10; i++)
     vd.push_back(i + i/10.0);
  typedef back_insert_iterator<vector<double> > back_ins_vec_it;
  // BACK INSERT ITERATOR:
  // Make back insert iterator (an output iterator) - using a factory function on the container
  // The back inserter overloads the assignment operator, see The C++ Programming Language 4ed, page 964.
  back_ins_vec_it bii = back_inserter(vd);
  *bii = 20;
  *bii = 21;
  print_seq(vd);  // 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 11 20 21
  // FRONT INSERT ITERATOR             (cannot be used on vector)
  typedef front_insert_iterator<list<double>> front_ins_list_it;      
  list<double> ld;              
  for(int i = 1; i <= 10; i++)
     ld.push_back(i + i/10.0);
  front_ins_list_it fii = front_inserter(ld);
  *fii = -3;
  *fii = -5.7;
  print_seq(ld);   // -5.7 -3 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 11
  // INSERT ITERATOR
  typedef insert_iterator<list<double>> ins_list_it;
  typename list<double>::iterator ins_begin = ld.begin();  
  ++++++ins_begin;        // Advance the iterator 3 positions - confusing use of prefix increment. 
  // An inserter that starts inserting at ins_begin
  ins_list_it ili = inserter(ld, ins_begin);
  *ili = 100;
  *ili = 101;
  print_seq(ld);   // -5.7 -3 1.1 100 101 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 11
}
// Print the sequence v on standard output:
template <typename CONT> void print_seq(const CONT &v){
  typename CONT::const_iterator it = v.begin();
  while(it != v.end()){
     std::cout << *it << " ";
     it++;
  }
  std::cout << std::endl;
}