Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision | ||
count_count_if [2008/12/09 11:22] abartcza |
count_count_if [2008/12/12 00:03] (aktualna) abartcza |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Algorytmy count count_if ====== | ====== Algorytmy count count_if ====== | ||
- | Algorytmy count, count_if należą do algorytmów niemodyfikujących. Algorytmy służą do przeszukiwania kontenera w celu znalezienia | + | 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). |
- | odpowiedniej wartości (count) lub spełnienia odpowiedniego predykatu (count_if). | + | |
===== Nagłówek dla algorytmów count i count_if ===== | ===== Nagłówek dla algorytmów count i count_if ===== | ||
Linia 9: | Linia 8: | ||
===== Opis algorytmu count ===== | ===== Opis algorytmu count ===== | ||
- | === Deklaracja algorytmu count === | + | === Definicja algorytmu count === |
- | <code cpp> template <class InputIterator, class T> | + | <code cpp> template <class InputIterator, class T> |
- | ptrdiff_t count ( InputIterator first, InputIterator last, const T& value ); | + | ptrdiff_t count ( InputIterator first, InputIterator last, const T& value ) |
+ | { | ||
+ | ptrdiff_t ret=0; | ||
+ | while (first != last) if (*first++ == value) ++ret; | ||
+ | return ret; | ||
+ | } | ||
</code> | </code> | ||
Linia 28: | Linia 32: | ||
=== Przykład użycia algorytmu count === | === Przykład użycia algorytmu count === | ||
- | <code cpp> #include <iostream> | + | <code cpp> typedef vector<string> VectorString; |
- | #include <vector> | + | |
- | #include <string> | + | |
- | // biblioteka z algorytmami STL | + | |
- | #include <algorithm> | + | |
- | // biblioteka wykorzystywana do dzielenia napisów | + | |
- | #include <boost/tokenizer.hpp> | + | |
- | + | ||
- | int main() { | + | |
- | typedef std::vector<std::string> VectorString; | + | typedef VectorString::iterator VectorStringIt; |
- | + | ||
- | typedef VectorString::iterator VectorStringIt; | + | // wektor imion |
- | + | VectorString vect; | |
- | // wektor imion | + | |
- | VectorString vect; | + | // iteratory wskazujace na wektor imion vect |
- | + | VectorStringIt start, end; | |
- | // iteratory wskazujace na wektor imion vect | + | |
- | VectorStringIt start, end, it; | + | // zmienna zawierająca liczbę elementów pasująca do danego wzroca |
- | + | ptrdiff_t result; | |
- | // 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ć | |
- | // przykladowy napis ktory jest wypelniony polskimi imionami, odzielony znakami | + | // polskich liter (ą,ę,ł...), zamiast ich stosować odpowiedniki (a,e,l...). |
- | // które nie są literami alfabetu (separatorami). W imionach nie należy wstawiać | + | const string STRING_NAMES = "Adam Michal Bartek, Adam . Ania ,/ EwA"; |
- | // polskich liter (ą,ę...). | + | |
- | const std::string STRING_NAMES = "Adam Michal Bartek, Adam . Ania ,/ EwA"; | + | // przykladowy wzorzec imienia dla funkcji count |
- | + | const string VALUE_COUNT = "Adam"; | |
- | // przykladowy wzorzec imienia dla funkcji count | + | |
- | const std::string VALUE_COUNT = "Adam"; | + | |
- | // dzielenie napisu na poszczególne imiona, następnie przypisywanie każdego z nich do wektora imion vect | + | // dzielenie napisu na poszczególne imiona, następnie przypisywanie każdego z nich do wektora imion vect |
- | boost::tokenizer<> tok(STRING_NAMES); | + | boost::tokenizer<> tok(STRING_NAMES); |
- | for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ | + | for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ |
vect.push_back(*beg); | vect.push_back(*beg); | ||
} | } | ||
| | ||
// przypisanie iteratorom start i end wartości początkowych | // przypisanie iteratorom start i end wartości początkowych | ||
- | start = vect.begin(); | + | start = vect.begin(); |
- | | + | |
end = vect.end(); | end = vect.end(); | ||
| | ||
Linia 73: | Linia 66: | ||
result = count(start, end, VALUE_COUNT) ; | result = count(start, end, VALUE_COUNT) ; | ||
- | std::cout << "Liczba wystapien imienia " << VALUE_COUNT << ": " << result << std::endl; | + | cout << "Liczba wystapien imienia " << VALUE_COUNT << ": " << result << endl; |
- | + | ||
- | return 0; | + | // liczba imion żeńskich w wektorze imion vect (zastosowanie algorymu count_if) |
- | + | result = count_if(start, end, NameWoman) ; | |
- | } | + | |
</code> | </code> | ||
===== Opis algorytmu count_if ===== | ===== Opis algorytmu count_if ===== | ||
- | === Deklaracja algorytmu count_if === | + | === Definicja algorytmu count_if === |
<code cpp> template <class InputIterator, class Predicate> | <code cpp> template <class InputIterator, class Predicate> | ||
- | ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred ); | + | ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred ) |
+ | { | ||
+ | ptrdiff_t ret=0; | ||
+ | while (first != last) if (pred(*first++)) ++ret; | ||
+ | return ret; | ||
+ | } | ||
</code> | </code> | ||
Linia 101: | Linia 98: | ||
=== Przykład użycia algorytmu count_if=== | === Przykład użycia algorytmu count_if=== | ||
- | <code cpp> #include <iostream> | + | <code cpp> // funkcja wykrywająca polskie imiona kobiet |
- | #include <vector> | + | bool NameWoman(const string& str) { |
- | #include <string> | + | return (str[str.size()-1] == 'a' || str[str.size()-1] == 'A'); |
- | // biblioteka z algorytmami STL | + | |
- | #include <algorithm> | + | |
- | // biblioteka wykorzystywana do dzielenia napisów | + | |
- | #include <boost/tokenizer.hpp> | + | |
- | + | ||
- | // funkcja wykrywająca polskie imiona kobiet | + | |
- | inline bool NameWoman(const std::string& str) { | + | |
- | return (str[str.size()-1] == 'a' || str[str.size()-1] == 'A'); | + | |
} | } | ||
// funkcja wykrywająca polskie imiona mężczyzn | // funkcja wykrywająca polskie imiona mężczyzn | ||
- | inline bool NameMan(const std::string& str) { | + | bool NameMan(const string& str) { |
- | return (!NameWoman(str)); | + | return (!NameWoman(str)); |
} | } | ||
- | // funkcja porównująca ilość liter w słowie | + | // funkcja wykrywająca imiona składające się z więcej niż 5 liter |
- | inline bool NameSize(const std::string& str) { | + | bool NameSize(const string& str) { |
- | return (str.size() > 5); | + | return (str.size() > 5); |
} | } | ||
- | + | ||
- | int main() { | + | int main() { |
- | typedef std::vector<std::string> VectorString; | + | // tutaj odpowiednie deklaracje ... |
- | + | ||
- | typedef VectorString::iterator VectorStringIt; | + | // przykladowy napis ktory jest wypelniony polskimi imionami, odzielony znakami |
- | + | // które nie są literami alfabetu (separatorami). W imionach nie należy wstawiać | |
- | // wektor imion | + | // polskich liter (ą,ę,ł...), zamiast ich stosować odpowiedniki (a,e,l...). |
- | VectorString vect; | + | const string STRING_NAMES = "Adam Michal Bartek, Adam . Ania ,/ EwA"; |
- | + | ||
- | // iteratory wskazujace na wektor imion vect | + | // przykladowy wzorzec imienia dla funkcji count |
- | VectorStringIt start, end, it; | + | const string VALUE_COUNT = "Adam"; |
- | + | ||
- | // 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 (ą,ę...). | + | |
- | const std::string STRING_NAMES = "Adam Michal Bartek, Adam . Ania ,/ EwA"; | + | |
- | + | ||
- | // przykladowy wzorzec imienia dla funkcji count | + | |
- | const std::string VALUE_COUNT = "Adam"; | + | |
- | // dzielenie napisu na poszczególne imiona, następnie przypisywanie każdego z nich do wektora imion vect | + | // dzielenie napisu na poszczególne imiona, następnie przypisywanie każdego z nich do wektora imion vect |
- | boost::tokenizer<> tok(STRING_NAMES); | + | boost::tokenizer<> tok(STRING_NAMES); |
- | for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ | + | for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ |
vect.push_back(*beg); | vect.push_back(*beg); | ||
} | } | ||
| | ||
// przypisanie iteratorom start i end wartości początkowych | // przypisanie iteratorom start i end wartości początkowych | ||
- | start = vect.begin(); | + | start = vect.begin(); |
- | | + | |
end = vect.end(); | end = vect.end(); | ||
- | | + | |
- | // liczba imion żeńskich w wektorze imion (zastosowanie algorymu count_if) | + | // liczba imion żeńskich w wektorze imion vect (zastosowanie algorymu count_if) |
result = count_if(start, end, NameWoman) ; | result = count_if(start, end, NameWoman) ; | ||
| | ||
- | std::cout << "Liczba Kobiet: " << result << std::endl; | + | cout << "Liczba Kobiet: " << result << endl; |
| | ||
- | // liczba imion męskich w wektorze imion (zastosowanie algorymu count_if) | + | // liczba imion męskich w wektorze imion vect (zastosowanie algorymu count_if) |
result = count_if(start, end, NameMan) ; | result = count_if(start, end, NameMan) ; | ||
| | ||
- | std::cout << "Liczba Mezczyzn: " << result << std::endl; | + | cout << "Liczba Mezczyzn: " << result << endl; |
| | ||
// liczba imion zawierające więcej niż 5 liter (zastosowanie algorymu count_if) | // liczba imion zawierające więcej niż 5 liter (zastosowanie algorymu count_if) | ||
result = count_if(start, end, NameSize) ; | result = count_if(start, end, NameSize) ; | ||
| | ||
- | std::cout << "Liczba slow o liczbie liter > 5: " << result << std::endl; | + | cout << "Liczba slow o liczbie liter > 5: " << result << endl; |
- | + | ||
- | return 0; | + | return 0; |
} | } | ||
</code> | </code> | ||
+ | |||
+ | ===== Przykładowy program wykorzystujący algorytmy count i count_if ===== | ||
+ | {{count_count_if2.cpp}} | ||
--- //[[master.bartczak@gmail.com|Adam Bartczak 5TIZ]]// | --- //[[master.bartczak@gmail.com|Adam Bartczak 5TIZ]]// |