C++/Algorytmy w STL/Operacje niemodyfikujące - szukanie

mismatch()

edytuj
pair<> mismatch( iterator1 początek, iterator1 koniec, iterator2 początek_drugi )
pair<> mismatch( iterator1 początek, iterator1 koniec, iterator2 początek_drugi, funkcja )

znajduje pierwsze różne elementy dwóch ciągów

Wartość zwracana
para znalezionych różniących się wartości, typu pair<iterator1, iterator2>
Działanie
porównuje kolejne elementy w dwóch zbiory (pierwszy określony przez początek, koniec oraz drugi zaczynający się w początek_drugi). Zwraca pierwsze wystąpienie dwóch różnych elementów, lub parę <koniec, odpowiedni_koniec_drugi> jeśli nie znajdzie.

find()

edytuj
iterator find( iterator początek, iterator koniec, wartość )
Działanie
znajduje pierwsze wystąpienie wartości w ciągu i zwraca iterator do niej, lub jeśli nie zostanie znaleziona, zwraca iterator koniec.
Przykład
program tworzy tablicę liczb 0, 10, 20, ..., 90 i sprawdza, czy znajdują się w nim liczby 30 i 33.
int main()
{
   vector<int> zbior;
   vector<int>::iterator wynik1, wynik2;

   for( int i = 0; i < 10; ++i )
      zbior.push_back(i*10);

   wynik1 = find(zbior.begin(), zbior.end(), 30);
   wynik2 = find(zbior.begin(), zbior.end(), 33);
   if( wynik1 != zbior.end() )
      cout << "Znaleziono 30.";
   if( wynik2 != zbior.end() )
      cout << "Znaleziono 33.";
}

Wynikiem jest: Znaleziono 30.

find_if()

edytuj
iterator find_if( iterator początek, iterator koniec, funkcja  )
Działanie
znajduje w ciągu pierwsze wystąpienie wartości spełniającej warunek


find_end()

edytuj
iterator find_end( iterator początek, iterator koniec, iterator początek_szukany, iterator koniec_szukany )
iterator find_end( iterator początek, iterator koniec, iterator początek_szukany, iterator koniec_szukany, funkcja )
Działanie
znajduje ostatnie wystąpienie ciągu (początek_szukany, koniec_szukany) jako podciągu w przedziale (początek, koniec). Można dostarczyć własną funkcję do porównywania elementów.

find_first_of()

edytuj
iterator find_first_of( iterator początek, iterator koniec, iterator początek_zbiór, iterator koniec_zbiór)
iterator find_first_of( iterator początek, iterator koniec, iterator początek_zbiór, iterator koniec_zbiór, funkcja )
Działanie
znajduje choć jeden element ze zbioru (początek_zbiór, koniec_zbiór) w podanym ciągu (początek, koniec). Można dostarczyć własną funkcję do porównywania elementów.

adjacent_find()

edytuj
iterator adjacent_find( iterator początek, iterator koniec )
iterator adjacent_find( iterator początek, iterator koniec, funkcja )
Działanie
porównuje kolejne wartości w obu ciągach, aż znajdzie parę tych samych - zwraca wówczas iterator do tej wartości, lub koniec jeśli nie ma pary identycznych wartości. Można dostarczyć własną funkcję do porównywania elementów.

search()

edytuj
iterator search( iterator początek, iterator koniec, iterator początek_szukany, iterator koniec_szukany )
iterator search( iterator początek, iterator koniec, iterator początek_szukany, iterator koniec_szukany, funkcja )
Działanie
znajduje pierwsze wystąpienie ciągu (początek_szukany, koniec_szukany) jako podciągu w przedziale (początek, koniec). Można dostarczyć własną funkcję do porównywania elementów.

search_n()

edytuj
iterator search_n( iterator początek, iterator koniec, n, wartość )
iterator search_n( iterator początek, iterator koniec, n, wartość, funkcja )
Działanie
znajduje pierwsze wystąpienie ciągu złożonego z n-tu wartości jako podciągu w przedziale (początek, koniec). Można dostarczyć własną funkcję do porównywania elementów.

Przykładowy program

edytuj
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

void wypisz(int key)
{
	cout<<key<<" ";
}

bool dodatnia(int key)
{
	return (key>0?true:false);
}

bool porownanie(int jeden, int dwa)
{
	return(jeden+1==dwa?true:false);
}

int main()
{
	int tab[]={-9,-6,-1,9,-2,0,0,-1,5,0,-8,9,10,-6,10};
	int tab2[]={-8,-5,0,10,-1,1,1,0,6,1,-7,10,11,-5,11};
	vector<int> wektorek(tab,tab+15);
	vector<int> wektorek2(tab2,tab2+15);
	for_each(wektorek.begin(),wektorek.end(),wypisz);
	cout<<endl;
	for_each(wektorek2.begin(),wektorek2.end(),wypisz);
	pair<vector<int>::iterator, vector<int>::iterator > para;
	para=mismatch(wektorek.begin(),wektorek.end(),wektorek2.begin());
	cout<<"\nPierwsza niezgodnosc w wektorkach (mismatch): "<<*para.first;
	cout<<" i "<<*para.second<<"\nPozycja, na ktorej wylapano niezgodnosc: ";
	cout<<(para.first-wektorek.begin())<<" i "<<(para.second-wektorek2.begin());
	vector<int>::iterator dycha=find(wektorek.begin(),wektorek.end(),10);
	cout<<"\nPozycja dziesiatki w wektorku pierwszym(find): "<<(dycha-wektorek.begin());
	dycha=find_if(wektorek.begin(),wektorek.end(),dodatnia);
	cout<<"\nPierwsza dodatnia z wektorka(find_if): "<<*dycha<<". Znajduje sie na pozycji: "<<(dycha-wektorek.begin());
	vector<int>::iterator findend=find_end(wektorek.begin(),wektorek.end(),wektorek.begin(),wektorek.begin()+4);
	cout<<"\nPoczatek ostatniego wystapienia ciagu wektorka 0-4 w wektorku zaczyna sie na pozycji: "<<(findend-wektorek.begin());
	vector<int>::iterator findfirstof;
	findfirstof=find_first_of(wektorek.begin(),wektorek.end(),wektorek2.begin(),wektorek2.begin()+5);
	cout<<"\nPierwszy element z przedzialu wektorka2 0-5 znajduje sie na pozycji (find_first_of): "<<(findfirstof-wektorek.begin());
	vector<int>::iterator adjacentfind;
	adjacentfind=adjacent_find(wektorek.begin(),wektorek.end());
	cout<<"\nPierwsza para w wektorku zaczyna sie na pozycji (adjacent_find): "<<(adjacentfind-wektorek.begin());
	vector<int>::iterator sercz;
	sercz=search_n(wektorek2.begin(),wektorek2.end(),2,1);
	cout<<"\nPoczatek ciagu zlozonego z dwoch jedynek w wektorku 2 znajduje sie na pozycji (search_n): "<<(sercz-wektorek2.begin());
	return 0;
}

Wynik działania powyższego programu:

-9 -6 -1 9 -2 0 0 -1 5 0 -8 9 10 -6 10 
-8 -5 0 10 -1 1 1 0 6 1 -7 10 11 -5 11 
Pierwsza niezgodnosc w wektorkach (mismatch): -9 i -8
Pozycja, na ktorej wylapano niezgodnosc: 0 i 0
Pozycja dziesiatki w wektorku pierwszym(find): 12
Pierwsza dodatnia z wektorka(find_if): 9. Znajduje sie na pozycji: 3
Poczatek ostatniego wystapienia ciagu wektorka 0-4 w wektorku zaczyna sie na pozycji: 0
Pierwszy element z przedzialu wektorka2 0-5 znajduje sie na pozycji (find_first_of): 2
Pierwsza para w wektorku zaczyna sie na pozycji (adjacent_find): 5
Poczatek ciagu zlozonego z dwoch jedynek w wektorku 2 znajduje sie na pozycji (search_n): 5