Narzędzia użytkownika

Narzędzia witryny


mismatch

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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ągiszukają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 elementyktó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]]//
mismatch.1238245075.txt.gz · ostatnio zmienione: 2009/03/28 13:57 przez mkrotewicz