/** Michał Korecki I1TIZ
*	
*	Algorytm iota() służy do przypisywania arytmetycznie zwiększających
*	się wartości do pewnego zadanego przedziału. Oznacza to, iż przypisuje
*	value do *first, value+1 do *(first+1) itd.. Uogólniając, każdy iterator i
*	w zadanym przedziale (first,last) ma przypisaną wartość value + (i-first).
*	
*	Iota() algorytm został zdefiniowany w standardowym nagłówku numeric oraz w 
*	niestandardowym, kompatybilnym wstecz nagłówku algo.h. Algorytm ten jest 
*	rozszerzeniem SGI i nie jest on częścią standardu C++.	
*	
*	Parametry:
*	- ForwardIterator first - początek zadanego przedziału, jegopierwszy element
*	- ForwardIterator last - koniec przedziału, ostatni element
*	- T value - wartość początkowa, którą sekwencyjnie zwiększając będziemy 
*				przypisywać elementom w zadanym przedziale
*	
*	Prototyp:
*	template <class ForwardIterator, class T>
*	void iota(ForwardIterator first, ForwardIterator last, T value);
*	
*	
*/


#include <iostream>	
#include <vector>	
#include <algo.h>

using namespace std;

int main(){
	
	// PRZYKŁAD 1
	// wypełnianie wektora o pojemności 20 liczbami całkowitymi
	// zaczynając od 0 wzwyż
	vector<int> v1(20);
	iota (v1.begin(), v1.end(), 0);
	// wpisanie danych
	copy(v1.begin(),v1.end(), ostream_iterator<int>(cout, " "));
  	cout << endl; 
	
	// PRZYKŁAD 2
	// generowanie permutacji liczb całkowitych z przedziału od 0 do 19
	vector<int> v2(20);
	iota(v2.begin(), v2.end(), 0);
	random_shuffle(v2.begin(),v2.end()); 
	// wypisanie danych
	copy(v2.begin(),v2.end(), ostream_iterator<int>(cout, " "));
  	cout << endl; 
	
	// PRZYKŁAD 3
	// generowanie powtarzającego się, uporządkowanego zbioru liczb(tu cyfr)
	// w tym przypadku: od 0 do 9, łącznie 50, czyli 5 takich grup
	vector<int> v3(50);
	vector<int>::iterator iter = v3.begin();
	int n =10;
	for(int i=0;i<v3.capacity()/n;++i)
		iota(iter+i*n, iter+(i+1)*n,0);
	// wypisanie danych
	copy(v3.begin(),v3.end(), ostream_iterator<int>(cout, " "));
  	cout << endl; 
	
	return 0;
}
