/*
* main.cpp
* @author Dawid Kuzyka (dawid.kuzyka@gmail.com)
* Program demonstruje dzialanie i wykorzystanie funkcji szablonowych find oraz find_if z biblioteki standardowej.
*/

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

/**
* Predykat - sprawdza czy zadana liczba jest liczba parzysta.
* @param i liczba, ktora jest sprawdzana.
* @return true - jezeli sprawdzana liczba jest liczba parzysta, false - w przeciwnym przypadku.
*/
bool czyParzysta(int i)
{
	return ((i%2) == 0);
}

/**
* Funkcja main programu.
*/
int main(int argc, char **argv)
{
	string str;
	vector<int> myvector; // wektor liczb calkowitych
	vector<int>::iterator it; // iterator wektora liczb calkowitych

	myvector.push_back(10); // dodanie do wektora myvector liczby 10
	myvector.push_back(25); // dodanie do wektora myvector liczby 25
	myvector.push_back(40); // dodanie do wektora myvector liczby 40
	myvector.push_back(55); // dodanie do wektora myvector liczby 55

	/*
	 * find
	 * Zwraca iterator do pierwszego elementu z zakresu elementow kontenera [first, last), ktory jest rowny value lub last jezeli nie zostal znaleziony taki element.
	 * Zachowanie tej funkcji jest rownowazne:
	 *		template<class InputIterator, class T>
	 *		InputIterator find ( InputIterator first, InputIterator last, const T& value )
	 *		{
	 *			for ( ;first!=last; first++) if ( *first==value ) break;
	 *			return first;
	 *		}
	 */
	it = find (myvector.begin(), myvector.end(), 10);  // zwraca iterator do pierwszego znalezionego wystapienia liczby 30 w calym wektorze myvector
	if (it != myvector.end()) // jezeli w wektorze myvector istnieje liczba 30 to zostaje wyswietlona
		cout << "Znaleziono w wektorze liczbe: " << *it << endl;

	/*
	 * find_if
	 * Zwraca iterator do pierwszego elementu z zakresu elementow kontenera [first, last), dla ktorego wartosc predykatu pred jest rowna true lub last jezeli nie zostal znaleziony taki element.
	 * Zachowanie tej funkcji jest rownowazne:
	 *		template<class InputIterator, class Predicate>
	 *		InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )
	 *		{
	 *			for ( ; first!=last ; first++ ) if ( pred(*first) ) break;
	 *			return first;
	 *		}
	 */
	it = find_if (myvector.begin(), myvector.end(), czyParzysta); // zwraca iterator do pierwszego znalezionego wystapienia liczby parzystej w calym wektorze myvector
	if (it != myvector.end()) // jezeli w wektorze myvector istnieja liczby parzyste to zostaje wyswietlona pierwsza z nich
		cout << "Pierwsza znaleziona liczba parzysta to: " << *it << endl;

	getline(cin, str);

	return 0;
}
