/*
 *	Autor: Maciej Roman   		              
 *	M.Roman@stud.elka.pw.edu.pl     	       		
 *	Temat: Biblioteka STL 
 *	opis algorytmu fill(), fill_n()	 
 *



	Algorytmy fill() i fill_n() używane są do zastąpieina wartości elementów w kolekcji w podanym zakresie.

	
	Przy użyciu algorytmy fill() używa się następującego szablonu:
	
	template < class ForwardIterator, class T >
		void fill ( ForwardIterator first, ForwardIterator last, const T& value )

		ForwardIterator first - pierwszy element kolekcji który zostanie zastąpiony  
		ForwardIterator last - element kolekcj który wyzancza koniec zakresu i nie zostanie już zastąpiony 
		const T& value - wartość na którą zostaną zamienione elemnty z podanego zakresu

	Algorytm fill() przypisuje wartość value do wszystkich elemnentów kolekcji z zakresu [first,last). 
	Zakres obejmuje wszystkie elementy pomiędzy start włącznie do last-1.   
	
	Przy użyciu algorytmy fill_n() używa się następującego szablonu:
	
	template < class OutputIterator, class Size, class T >
		void fill_n ( OutputIterator first, Size n, const T& value );

		ForwardIterator first - pierwszy element kolekcji który zostanie zastąpiony  
		Size n - ilość zamienonych elemntów zaczynając o delemntu first
		const T& value - wartość na którą zostaną zamienione elemnty z podanego zakresu
	
	Algorytm fill_n() przypisuje wartość value do wszystkich elemntów kolejcji z zakresu [first, first+n). 

	Warunkiem działania obu algorytmów jest możliwość przypisania wartości do T,
	oraz w przypadku fill_n() zamiany warotści Size na typ Intiger
 
 */

#include <algorithm>
#include <vector>
#include <string>
#include <iostream>


using namespace std;


// Prosta klasa służąca do demonstracji
class Towar 
{
private:
	string status;
	int cena;
public:
	Towar()
	{
		status="W sklepie";
		cena=100;
	}
	Towar(string c,int x)
	{
		status=c;
		cena=x;
	}
	void wypisz()
	{
		cout<<status<<endl;
	}
};
//Przykład 1 pokazuje wykorzystanie obu algorytmów w połączeniu z stworzoną przez nas klasa i wektorem
int main()
{
	//Stworzenie wektora z towarami;
	vector<Towar> towary;
		
	//Tworzenie towarów
	Towar nieprzeceniony;
	Towar przeceniony("przecenione",50);
	Towar zamowiony("zamowione",0);

	//Dodanie towarów nieprzecenionych do wektora
	for(unsigned int i=0;i<=5;i++)
		towary.push_back(nieprzeceniony);
		
	cout<<"Lista towarow przed zastosowaniem algorytmów: "<<endl;
	for(unsigned int i=0;i<=towary.size()-1;i++)
	 	towary[i].wypisz();
	cout<<endl;

	//Użycie algorytmu fill do zamiany towarów na przecenione oprócz dwóch ostatnich
	fill(towary.begin(),towary.end()-2,przeceniony);

	cout<<"Lista towarow po zastosowaniu algorytmu fill() : "<<endl;
	for(unsigned int i=0;i<=towary.size()-1;i++)
	 	towary[i].wypisz();
	cout<<endl;

	// Użycie algorytmu fill_n do zamiany statusu przech pierwszych towarów na zamowione 
	fill_n(towary.begin(),3,zamowiony);

	cout<<"Lista towarow po zastosowaniu algorytmu fill_n(): "<<endl;
	for(unsigned int i=0;i<=towary.size()-1;i++)
	 	towary[i].wypisz();
	cout<<endl;


}





