Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
search_n [2008/12/12 22:11] ltrzaska |
search_n [2008/12/12 23:03] (aktualna) ltrzaska |
||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| - | ===== seach_n ==== | + | ===== Algorytm seach_n ==== |
| - | ===== adjacent_find.cpp ===== | + | <code cpp> |
| - | {{:stl_algorytmy:search_n.ltrzaska.cpp|}} | + | iterator search_n( iterator start, iterator end, size_t num, const TYPE& val ); |
| + | iterator search_n( iterator start, iterator end, size_t num, const TYPE& val, BinPred p ); | ||
| + | </code> | ||
| + | |||
| + | Funkcja search_n() szuka //num// wystapień w zasiegu kontenera [start,end). | ||
| + | Jeżeli zostanie znalezione num kopii danego elementu występujących kolejno | ||
| + | w sekwencji, funkcja zwraca iterator na pierwszy znaleziony element. | ||
| + | W przeciwnym wypadku zwraca iterator na end danej sekwencji. | ||
| + | Jeżeli predykat binarny jest zadany, to zostaje użyty do specyficznego | ||
| + | porównania elementow. | ||
| + | |||
| + | == Użycie standardowe search_n == | ||
| + | Znajdź np. dwa wystąpienia słowa w kontenerze np. wektorze. | ||
| + | <code cpp> | ||
| + | vector<string> vecA; | ||
| + | vecA.push_back("Zebra"); | ||
| + | vecA.push_back("Anakonda"); | ||
| + | vecA.push_back("Anakonda"); | ||
| + | vecA.push_back("Zyrafa"); | ||
| + | |||
| + | //iterator wskazujacy na pierwszy element ze znalezionych w sekwencji | ||
| + | vector<string> itResult = search_n(vecA.begin(), vecA.end(), 2, "Anakonda"); | ||
| + | </code> | ||
| + | |||
| + | == Użycie search_n z predykatem binarnym == | ||
| + | Chcemy zdefiniować własny sposób porównania wyszukiwanych n elementów. Dla przykładu za równe uznajmy elementy | ||
| + | których ostatnia litera jest taka sama. | ||
| + | <code cpp> | ||
| + | //deklaracja binarnego predykatu | ||
| + | //zwraca TRUE gdy porownywane stringi maja ostatnia litere ta sama | ||
| + | template<class T> | ||
| + | struct string_equal_last : public binary_function <T, T, bool> { | ||
| + | bool operator()(const T& x, const T& y) { | ||
| + | if(typeid(T) != typeid(std::string)) //zabezpiecz przed uzyciem nie dla stringu | ||
| + | return false; | ||
| + | |||
| + | string::const_iterator ix = x.end(); | ||
| + | string::const_iterator iy = y.end(); | ||
| + | if(*--ix == *--iy) return true; | ||
| + | return false; | ||
| + | } | ||
| + | }; | ||
| + | //wyszukanie 4 kolejnych elementów które mają taką samą ostatnią literę jaką ma "Anakonda" | ||
| + | |||
| + | itResult = search_n(vecA.begin(), vecA.end(), 4, "Anakonda", string_equal_last<string>()); | ||
| + | </code> | ||
| + | |||
| + | ===== Źródło: adjacent_find.cpp ===== | ||
| + | {{:search_n.ltrzaska.cpp|}} | ||