====== Algorytmy count count_if ======
Algorytmy count, count_if należą do algorytmów niemodyfikujących. Algorytmy służą do przeszukiwania pewnej liczby elementów z kontenera w celu znalezienia odpowiedniej wartości (count) lub spełnienia odpowiedniego predykatu (count_if).
===== Nagłówek dla algorytmów count i count_if =====
#include
===== Opis algorytmu count =====
=== Definicja algorytmu count ===
template
ptrdiff_t count ( InputIterator first, InputIterator last, const T& value )
{
ptrdiff_t ret=0;
while (first != last) if (*first++ == value) ++ret;
return ret;
}
=== Parametry algorytmu count===
* first - element kontenera od którego zaczynamy wyszukiwanie
* last - element kontenera na którym kończymy wyszukiwanie
* value - wartość szukana
=== Wartość zwracana algorytmu count ===
Liczba pasujących elementów w kontenerze do wartości szukanej value.
=== Działanie algorytmu count ===
Algorytm count oblicza liczę elementów w kontenerze z zakresu [first, last) które pasują do warotości value, następnie zwraca liczbę pasujących elementów.
=== Przykład użycia algorytmu count ===
typedef vector VectorString;
typedef VectorString::iterator VectorStringIt;
// wektor imion
VectorString vect;
// iteratory wskazujace na wektor imion vect
VectorStringIt start, end;
// zmienna zawierająca liczbę elementów pasująca do danego wzroca
ptrdiff_t result;
// przykladowy napis ktory jest wypelniony polskimi imionami, odzielony znakami
// które nie są literami alfabetu (separatorami). W imionach nie należy wstawiać
// polskich liter (ą,ę,ł...), zamiast ich stosować odpowiedniki (a,e,l...).
const string STRING_NAMES = "Adam Michal Bartek, Adam . Ania ,/ EwA";
// przykladowy wzorzec imienia dla funkcji count
const string VALUE_COUNT = "Adam";
// dzielenie napisu na poszczególne imiona, następnie przypisywanie każdego z nich do wektora imion vect
boost::tokenizer<> tok(STRING_NAMES);
for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
vect.push_back(*beg);
}
// przypisanie iteratorom start i end wartości początkowych
start = vect.begin();
end = vect.end();
// liczba wystapien imienia zawartego w zmiennej VALUE_COUNT (zastosowanie algorymu count)
result = count(start, end, VALUE_COUNT) ;
cout << "Liczba wystapien imienia " << VALUE_COUNT << ": " << result << endl;
// liczba imion żeńskich w wektorze imion vect (zastosowanie algorymu count_if)
result = count_if(start, end, NameWoman) ;
===== Opis algorytmu count_if =====
=== Definicja algorytmu count_if ===
template
ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred )
{
ptrdiff_t ret=0;
while (first != last) if (pred(*first++)) ++ret;
return ret;
}
=== Parametry algorytmu count_if ===
* first - element kontenera od którego zaczynamy wyszukiwanie
* last - element kontenera na którym kończymy wyszukiwanie
* pred - predykat do spełnienia
=== Wartość zwracana algorytmu count_if ===
Liczba elementów spełniających predykat pred.
=== Działanie algorytmu count_if ===
Algorytm count_if oblicza liczbę elementów w kontenerze z zakresu [first, last) spełniających predykat pred przekazany jako obiekt funkcyjny, następnie zwraca liczbę pasujących elementów.
=== Przykład użycia algorytmu count_if===
// funkcja wykrywająca polskie imiona kobiet
bool NameWoman(const string& str) {
return (str[str.size()-1] == 'a' || str[str.size()-1] == 'A');
}
// funkcja wykrywająca polskie imiona mężczyzn
bool NameMan(const string& str) {
return (!NameWoman(str));
}
// funkcja wykrywająca imiona składające się z więcej niż 5 liter
bool NameSize(const string& str) {
return (str.size() > 5);
}
int main() {
// tutaj odpowiednie deklaracje ...
// przykladowy napis ktory jest wypelniony polskimi imionami, odzielony znakami
// które nie są literami alfabetu (separatorami). W imionach nie należy wstawiać
// polskich liter (ą,ę,ł...), zamiast ich stosować odpowiedniki (a,e,l...).
const string STRING_NAMES = "Adam Michal Bartek, Adam . Ania ,/ EwA";
// przykladowy wzorzec imienia dla funkcji count
const string VALUE_COUNT = "Adam";
// dzielenie napisu na poszczególne imiona, następnie przypisywanie każdego z nich do wektora imion vect
boost::tokenizer<> tok(STRING_NAMES);
for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
vect.push_back(*beg);
}
// przypisanie iteratorom start i end wartości początkowych
start = vect.begin();
end = vect.end();
// liczba imion żeńskich w wektorze imion vect (zastosowanie algorymu count_if)
result = count_if(start, end, NameWoman) ;
cout << "Liczba Kobiet: " << result << endl;
// liczba imion męskich w wektorze imion vect (zastosowanie algorymu count_if)
result = count_if(start, end, NameMan) ;
cout << "Liczba Mezczyzn: " << result << endl;
// liczba imion zawierające więcej niż 5 liter (zastosowanie algorymu count_if)
result = count_if(start, end, NameSize) ;
cout << "Liczba slow o liczbie liter > 5: " << result << endl;
return 0;
}
===== Przykładowy program wykorzystujący algorytmy count i count_if =====
{{count_count_if2.cpp}}
--- //[[master.bartczak@gmail.com|Adam Bartczak 5TIZ]]//