#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>

using namespace std;

template <typename Iterator>
void primzahlen(long ende,Iterator iter);

int main()
{
   primzahlen(100,ostream_iterator<long>(cout," "));    // Primzahlen auf dem Bildschirm ausgeben

   vector<long> PrimVector;
   back_insert_iterator<vector<long> > PrimVectorIter(PrimVector); // Einen Iterator verwenden der push_back verwendet
   primzahlen(100,PrimVectorIter); // Primzahlen in einen Vector schreiben (per push_back)

   return 0;
}

template <typename Iterator>
void primzahlen(long ende,Iterator iter)
{
    long i = 0;
    long j = 0;
      bool* prim = new bool[ende+1];

      for(i=0;i<=ende;++i)
         prim[i] = true;            // mit true vorbelegen

      prim[0] = prim[1] = false;    // 0 und 1 mit false belegen

      for(i=2;i*i<=ende;++i)        // Hauptschleife
         if(prim[i])
            for(j=i+i;j<=ende;j+=i)
               if (prim[j])      // obsolet, jedoch schneller
                  prim[j] = false;

         for(i=0;i<=ende;++i)
            if(prim[i])
               *iter = i;

      prim = 0; delete prim;
}


