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

Z Wikibooks, biblioteki wolnych podręczników.

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