Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision | ||
mismatch [2009/03/28 13:57] mkrotewicz |
mismatch [2009/04/28 14:26] (aktualna) mkrotewicz |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Algorytm mismatch ====== | ====== Algorytm mismatch ====== | ||
- | Algorytm mismatch() porównuje wzajemnie dwa ciągi, szukając pierwszej pary niezgodnych elemntów. | + | Algorytm mismatch() porównuje dwie sekwencje w celu znalezienia pierwszego niepasującego elementu. Algorytm ten umożliwia korzystanie z operatora == albo z dwuargumentowego predyktu. Zaliczany jest do algorytmów niemodyfikujących. |
+ | |||
+ | ===== Nagłówek dla algorytmu ===== | ||
+ | <code cpp> #include <algorithm> </code> | ||
+ | |||
+ | ===== Opis algorytmu ===== | ||
+ | |||
+ | **__Definicja algorytmu__** | ||
+ | |||
+ | <code cpp> | ||
+ | template <class IteratorWejsciowy1, class IteratorWejsciowy2> | ||
+ | pair<IteratorWejsciwoy1, IteratorWejsciowy2> | ||
+ | mismatch(IteratorWejsciowy1 pierwszy1, IteratorWejsciowy2 ostatni1, | ||
+ | IteratorWejsciowy2 pierwszy2); | ||
+ | |||
+ | template <class IteratorWejsciowy1, class IteratorWejsciowy2, class PredykatDwuargumentowy> | ||
+ | pair<IteratorWejsciwoy1, IteratorWejsciowy2> | ||
+ | mismatch(IteratorWejsciowy1 pierwszy1, IteratorWejsciowy2 ostatni1, IteratorWejsciowy2 pierwszy2, | ||
+ | PredykatDwuargumentowy pred_dwuargumentowy); | ||
+ | </code> | ||
+ | |||
+ | **__Parametry algorytmu__** | ||
+ | * **pierwszy1, ostatni1** - iteratory wskazujące na zakres danych wejściowych pierwszych. Przetwarzaniu podlegają elementy z zakresu [pierwszy1, ostatni1) | ||
+ | * **pierwszy2** - iterator wskazujący na pozycje danych wejściowych drugich. Koniec tego zakresu jest wyliczany na podstawie długości zakresu [pierwszy1, ostatni1). Należy pamiętać aby za elementem peirwszy2 istniało jeszcze co najmniej tyle elementów, ile jest pomiędzy pierwszy1 i ostatni1 | ||
+ | * **ped_dwuargumentowy** - predykat do spełnienia | ||
+ | |||
+ | |||
+ | W przypadku, gdy nie zostaną znalezione elementy, które do siebie nie pasują, wartością zwracaną jest **pair<ostatni1, pierwszy2 + (ostatni1 - pierwszy1)>**. | ||
+ | |||
+ | |||
+ | |||
+ | __ | ||
+ | **Przykład użycia algorytmu mismatch bez predykatu.**__ | ||
+ | <code cpp> | ||
+ | vector <int> wektor1; | ||
+ | list <int> lista1; | ||
+ | |||
+ | for(int i=0; i<7 ; i++) wektor1.push_back(i); //wektor1 [0,1,2, 3,4,5,6] | ||
+ | for(int i=0; i<8; i++){ //lista1 [0,1,2,982,4,5,6,7] | ||
+ | if(i==4) | ||
+ | lista1.push_back(982); | ||
+ | else | ||
+ | lista1.push_back(i); | ||
+ | } | ||
+ | |||
+ | pair<vector<int>::iterator, list<int>::iterator> para_WektorLista; | ||
+ | para_WektorLista = mismatch(wektor1.begin(), wektor1.end(), lista1.begin()); //znajduje pary niezgodne | ||
+ | cout<<"Niezgodna para dla wektora1 i listy1: ( "<<*para_WektorLista.first<<", "<<*para_WektorLista.second<<")"<<endl; | ||
+ | |||
+ | //Niezgodna para dla wektora1 i listy1: (3,982) | ||
+ | </code> | ||
+ | |||
+ | |||
+ | __**Przykład użycia algorytmu mismatch z predykatem.**__ | ||
+ | <code cpp> | ||
+ | class rowne_parzyste{ | ||
+ | public: | ||
+ | bool operator ()(int ciag1, int ciag2){ //pierwszy predytkt | ||
+ | //czy obie wartości są rowne i parzyste | ||
+ | return ( ciag1 == ciag2 || ciag1%2 ==0) ? true : false; | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | |||
+ | bool nierowne_nieparzyste(int ciag1, int ciag2){ //drugi predykt | ||
+ | return ( ciag1 != ciag2 || (ciag1%2==1 && ciag2%2==1)) ? true : false; | ||
+ | } | ||
+ | |||
+ | |||
+ | int main(){ | ||
+ | |||
+ | int tablica1[] = {1,2,3,4,67,6,7,8,9,10}; | ||
+ | int tablica2[] = {1,2,3,4, 5,6,7,8,9,10,11,12}; | ||
+ | |||
+ | int rozmiar_tablicy1= sizeof(tablica1)/sizeof(int); | ||
+ | int rozmiar_tablicy2= sizeof(tablica2)/sizeof(int); | ||
+ | |||
+ | pair<int*,int*> para_tablica; | ||
+ | pair<int*,int*> para_tablica; | ||
+ | |||
+ | //zastsowanie mismatch z pierwszym predyktem | ||
+ | para_tablica = mismatch(tablica1, tablica1+rozmiar_tablicy1, tablica2, rowne_parzyste()); //znajduje pary, ktore nie spelniaja predyktu | ||
+ | cout<<"Nierowna i nieparzysta para dla tablicy1 i tablicy2: ( "<<*para_tablica.first<<", "<<*para_tablica.second<<")"<<endl; | ||
+ | //Nierowna i nieparzysta para dla tablicy1 i tablicy2: (67,5) | ||
+ | |||
+ | //zastosowanie mismatch z drugi predyktem | ||
+ | para_tablica = mismatch(tablica1, tablica1+rozmiar_tablicy1, tablica2, nierowne_nieparzyste); //znajduje pary, ktore nie spelniaja predyktu | ||
+ | cout<<"Rowna i parzysta para dla tablicy1 i tablicy2: ( "<<*para_tablica.first<<", "<<*para_tablica.second<<")"<<endl; | ||
+ | //Rowna i parzysta para dla tablicy1 i tablicy2: (2,2) | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Przykład programu wykorzystujący algorytm mismatch ===== | ||
+ | {{mismatch.cpp}} | ||
+ | |||
+ | //[[mkrotewicz@gmail.com|Michał Krotewicz 6SST]]// |