C++/Algorytmy w STL/Operacje niemodyfikujące - szukanie
< C++ | Algorytmy w STL
mismatch()
edytujpair<> 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()
edytujiterator 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()
edytujiterator 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()
edytujiterator 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()
edytujiterator 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()
edytujiterator 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()
edytujiterator 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()
edytujiterator 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