Narzędzia użytkownika

Narzędzia witryny


mismatch

Algorytm mismatch

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

 #include <algorithm> 

Opis algorytmu

Definicja algorytmu

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);

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.

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)

Przykład użycia algorytmu mismatch z predykatem.

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;
}

Przykład programu wykorzystujący algorytm mismatch

mismatch.txt · ostatnio zmienione: 2009/04/28 14:26 przez mkrotewicz