/********************************************/
/*	Autor: Piotr Duda   	    	    */
/*	P.Duda.1@stud.elka.pw.edu.pl	    */			
/*	Temat: algorytmy stl,		    */
/*	algorytmy	remove, remove_if   */
/********************************************/

/* remove - usuwa z okreslonego zakresu elementy rowne podanej wartosci. */
/*remove_if - usuwa z okreslonego zakresu elementy, dla ktorych dany predykat jest prawdziwy. */

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

//Definicja naszego predykatu
bool is_gdansk(const string city);

int main(){
	vector<string> v;

	v.reserve(5);
	v.push_back("Warszawa");
	v.push_back("Szczecin");
	v.push_back("Poznan");
	v.push_back("Gdansk");
	v.push_back("Wroclaw");
	

	//zostanie wypisana wartosc 5 
	cout << "Ilosc elementow zawartych w kontenerze " << v.size() << endl;
	
	//na ekranie zostana wyswietlone poszczegolne miasta 
	//w takiej samej kolejnosci, w jakiej zostaly wpisany do konternera
	cout << "Przed uzyciem algorytmu remove : ";
	for(int i=0; i<=4; ++i){
		cout << v[i] << ",";
	}

	/******************************/
	/*  UZYCIE ALGORYTMU REMOVE   */
	/******************************/
	
	//Usuwamy z kontenera miasto Warszawa
	vector<string>::iterator NewEnd(remove(v.begin(),v.end(),"Warszawa"));
	
	//po usunieciu liczebnosc elementow zawartych w kontenerze pozostaje TAKA SAMA
	cout << "\nIlosc elementow zawartych w kontenerze  " << v.size() << endl;
	
	//na ekranie zostana wypisane wszystkie miasta bez Warszawy
	cout << "Po uzyciu algorytmu remove : ";
	copy(v.begin(), NewEnd, ostream_iterator<string>(cout, " "));
    
	/******************************/
	/*  UZYCIE ALGORYTMU REMOVE_IF   */
	/******************************/
	
	//W tym przypadku element zostanie usuniety z kontenera (logicznie)
	//gdy predykat zwroci wartosc TRUE
	vector<string>::iterator NewEnd2(remove_if(v.begin(),NewEnd,is_gdansk));

	//po usunieciu liczebnosc elementow zawartych w kontenerze pozostaje TAKA SAMA
	cout << "\nIlosc elementow zawartych w kontenerze  " << v.size() << endl;
	
	//Tym razem zostana wypisane tylko trzy miasta tj. Szczecin, Poznan, Wroclaw
	cout << "Po uzyciu algorytmu remove_if : ";
	copy(v.begin(), NewEnd2, ostream_iterator<string>(cout, " "));
	
}
// Nasz predykat zwracajacy wartosc 1 gdy napis ma wartosc "Gdansk"
bool is_gdansk(const string city){
	return (city == "Gdansk");
}
