// przyklad uzycia unique, unique copy
// autor: Paulina Grabowska

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

// implementacja funkcji porownujacej elementy
bool comp(int i, int j) 
{
  return (i==j);
}

int main () 
{
	// tworzy wektory z powtarzajacymi sie po sobie elementami
	int myints[] = {10,20,20,20,30,30,20,20,10};
	vector<int> myvector (myints,myints+9);		// 10 20 20 20 30 30 20 20 10
	vector<int>::iterator it;

	// PRZYKLAD UZYCIA UNIQUE Z DOMYSLNYM OPERATOREM ==

	// użycie unique z domyslnym operatorem == 
	it = unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 30 20 20 10

	// dostosowanie wielkosci myvector do zaktualizowanej liczby elementow
	myvector.resize( it - myvector.begin() );       // 10 20 30 20 10

	// wypisanie zawartosci myvector
	cout << "\nunique z domyslnym operatorem==\n";
	for (vector<int>::iterator iter=myvector.begin(); iter!=myvector.end(); ++iter)
		cout << " " << *iter;


	// PRZYKLAD UZYCIA UNIQUE ZE ZDEFINIOWANA FUNKCJA POROWNUJACA ELEMENTY
	myvector.clear();
	myvector.insert(myvector.begin(), myints, myints + 9);	// 10 20 20 20 30 30 20 20 10

	// uzycie unique ze zdediniowana funkcja porownujaca elementy
	it = unique (myvector.begin(), myvector.end(), comp);   // 10 20 30 20 10 30 20 20 10

	// dostosowanie wielkosci myvector do zaktualizowanej liczby elementow
	myvector.resize( it - myvector.begin() );       // 10 20 30 20 10

	// wypisanie zawartosci myvector
	cout << "\n\nunique ze zdefiniowana funkcja porownujaca\n";
	for (vector<int>::iterator iter=myvector.begin(); iter!=myvector.end(); ++iter)
		cout << " " << *iter;


	// PRZYKLAD UZYCIA UNIQUE_COPY
	vector<int> myvector1 (9); // 0 0 0 0 0 0 0 0 0

	// użycie unique_copy z domyslnym operatorem == 
	it=unique_copy (myints,myints+9,myvector1.begin()); // 10 20 30 20 10 0 0 0 0

	// sortowanie elementow
	sort (myvector1.begin(),it); // 10 10 20 20 30 0 0 0 0

	// uzycie unique_copy ze zdediniowana funkcja porownujaca elementy
	it=unique_copy (myvector1.begin(), it, myvector1.begin(), comp);	// 10 20 30 20 30 0 0 0 0

	// dostosowanie wielkosci myvector1 do zaktualizowanej liczby elementow
	myvector1.resize( it - myvector1.begin() ); // 10 20 30

	// wypisanie zawartosci
	cout << "\n\nPrzyklad uzycia unique_copy\n";
	for (vector<int>::iterator iter=myvector1.begin(); iter!=myvector1.end(); ++iter)
		cout << " " << *iter;

	cout << endl;

	return 0;
}
