На этом шаге мы рассмотрим алгоритмы подсчета элементов.
Алгоритмы, описанные в этом и следующих шагах, работают с элементами, не изменяя их значений или порядка следования.
Приведем общий вид алгоритмов, осуществляющих подсчет элементов.
difference_type
count (InputIterator beg, InputIterator end, const T& value)
difference_type
count_if (InputIterator beg, InputIterator end, UnaryPredicate op)
Первая форма подсчитывает элементы с заданным значением в интервале [beg,end). Вторая форма подсчитывает в интервале [beg,end) элементы, для которых унарный предикат op(elem) возвращает true.
Тип возвращаемого значения difference_type представляет тип разности итераторов:
typename iterator_traits<InputIterator>::difference_type
Предикат ор не должен изменять свое состояние во время вызова.
Предикат ор не должен изменять передаваемые аргументы.
В классах ассоциативных контейнеров (множества, мультимножества, отображения и мультиотображения) определена похожая функция count() для подсчета элементов с заданным ключом (смотри 198 шаг).
Сложность линейная (numberOfElements сравнений нли вызовов op соответственно).
Пример подсчета элементов по разным критериям:
//--------------------------------------------------------------------------- #include <vcl.h> #include "algostuff.hpp" #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } bool isEven (int elem) { return elem % 2 == 0; } int main() { vector<int> coll; int num; INSERT_ELEMENTS(coll,1,9); PRINT_ELEMENTS(coll,"Исходный вектор:\n "); // Подсчет элементов со значением 4 num = count (coll.begin(), coll.end(), // Интервал 4); // Значение cout << ToRus("Число элементов, равных 4: ") << num << endl; // Подсчет четных элементов num = count_if (coll.begin(), coll.end(), // Интервал isEven); // Критерий cout << ToRus("Число четных элементов: ") << num << endl; // Подсчет элементов со значениями, большими 4 num = count_if (coll.begin(), coll.end(), // Интервал bind2nd(greater<int>(),4)); // Критерий cout << ToRus("Число элементов, больших 4: ") << num << endl; getch(); return 0; } //---------------------------------------------------------------------------
Программа выводит следующий результат:
Рис.1. Результат работы приложения
Вместо пользовательской функции isEven() можно воспользоваться выражением:
not1(bind2nd(modulus<int>(),2))
На следующем шаге мы рассмотрим алгоритмы нахождения максимума и минимума.