Немодифицирующие алгоритмы. Подсчет элементов

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

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

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

  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;
}

//---------------------------------------------------------------------------

Текст этого примера можно взять 245 шаг.

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий