Шаг 268.
Библиотека STL.
Алгоритмы STL. Немодифицирующие алгоритмы. Подсчет элементов

    На этом шаге мы рассмотрим алгоритмы подсчета элементов.

    Алгоритмы, описанные в этом и следующих шагах, работают с элементами, не изменяя их значений или порядка следования.

Подсчет элементов

    Приведем общий вид алгоритмов, осуществляющих подсчет элементов.

  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
Структура iterator_traits описана на 233 шаге.

    Предикат ор не должен изменять свое состояние во время вызова.

    Предикат ор не должен изменять передаваемые аргументы.

    В классах ассоциативных контейнеров (множества, мультимножества, отображения и мультиотображения) определена похожая функция 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))
За подробностями обращайтесь на 245 шаг.

    На следующем шаге мы рассмотрим алгоритмы нахождения максимума и минимума.




Предыдущий шаг Содержание Следующий шаг