/*Kamil Szwaba 1IBE*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> 

using namespace std;

int main()
{
	int i;
	/*kontenery w postaci wektorow, algorytm equal 
	sluzy do porownywania zawartosci dwoch kontenerow*/
	vector<string> tab1(10,"0");
	vector<string> tab2(10,"0");
	vector<string> tab3(10,"1");
	vector<string> tab4(10,"0");
	vector<char> slowo(4);

	vector<string>::iterator it1;
	vector<string>::iterator it2;
	vector<string>::iterator it3;
	vector<string>::iterator it4;
	vector<char>::iterator it5;
	vector<char>::iterator it6;
	vector<int>::iterator it7;
	vector<int>::iterator it8;
	vector<int>::iterator it9;
	
	vector<int> c1(3);
	vector<int> c2(8);
	for(int j=0; j<3; j++){
		c1[j]=j;
	}

	c2[0]=1;
	c2[1]=1;
	c2[2]=1;
	c2[3]=0;
	c2[4]=1;
	c2[5]=2;
	c2[6]=1;
	c2[7]=1;

	it1=tab1.begin();
	it2=tab1.end();
	it3=tab2.begin();
	it4=tab3.begin();
	
	/*skladnia polecenia equal(): pierwszy argument
	to wskaznik na pierwszy element kontenera pierwszego;
	drugi argument to wskaznik na "za-ostatni" element kontenera
	pierwszego, tzn ze wskazuje za ostatni element kontenera 
	pierwszego; trzeci argument jest wskaznikiem na pierwszy
	element kontenera drugiego. Porownywana liczba elementow
	kontenerow rowna sie (arg2 - arg1), co oznacza, ze 
	porownanych zostanie tyle elementow ile miesci sie w zakresie
	wskazanym przez pierwsze dwa argumenty. Funkcja equal() zwraca
	true jezeli elementy w danym zakresie w dwoch kontenerach 
	sa takie same, badz false jezeli przynajmniej jeden element
	jest rozny.*/

	/*tab1 i tab2 sa to identyczne kontenery, z taka sama
	iloscia elemntow i z ta sama zawartoscia, stad zostaje wyswitlony
	odpowiedni napis po instrukcji if.*/
	if (equal(it1,it2,it3))	{
		cout<<"tab1 i tab2 rowne"<<endl;
	}
	/*tab1 i tab3 posiadaja rozne elementy, dlatego 
	na ekranie zostanie wyswitlony napis wystepujacy po instrukcji
	else.*/
	if (equal(it1,it2,it4))	{
		cout<<"tab1 i tab3 rowne"<<endl;
	}
	else {
		cout<<"tab1 i tab3 rozne"<<endl;
	}

	for(i=0;i<4;i++)
	{
		tab4.push_back("1");
	}
	
	it4=tab4.begin();
	/*tab4 zawiera na poczatku dokladnie zawartosc tab1 , ale
	po ostatnim '0', konczacym zakres tab1 zaczynaja wystepowac '1', ktore
	jednak nie sa brane pod uwage zgodnie z definicja funkcji equal()*/
	if (equal(it1,it2,it4))	{
		cout<<"tab1 i tab4 sa rownena na zakresie wielkosci wektora tab1"<<endl;
	}

	it5=slowo.begin();
	it6=slowo.end();

	slowo[0]='a';
	slowo[1]='n';
	slowo[2]='n';
	slowo[3]='a';
	/*W tym przypadku ostatni argument zawiera iterator wsteczny , wskazujacy 
	na ostatni element wktrora char, iteratory podzcas porownywania bedzie
	przechodzil do tylu po wektorze slowo, equal() zwraca true, poniewaz
	slowo zawiera wyraz , ktory od tylu wyglada tak samo*/
	if (equal(it5,it6,slowo.rbegin())){
		cout<<"slowo anna brzmi tak samo czytajac od konca"<<endl;
	}
	it7=c1.begin();
	it8=c1.end();
	it9=c2.begin();
	
	/*Funkcje equal() mozemy wykorzystac do wyszukiwania
	sekwencji elementow w kontenerze, w tym przypadku 
	w kontenerze c2 wyszukiwana jest sekwencja 012*/
	for(int k=0;k<5;k++){
		if (equal(it7,it8,it9)) {
			cout<<"sekwencja odnaleziona miedzy " << k << " a " << k+3 << endl;
		}
		it9++;
	}

	return 0;
}
