Пространства имён
Варианты
Действия

std::count, std::count_if

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Defined in header <algorithm>
template< class InputIt, class T >

typename iterator_traits<InputIt>::difference_type

    count( InputIt first, InputIt last, const T &value );
(1)
template< class InputIt, class UnaryPredicate >

typename iterator_traits<InputIt>::difference_type

    count_if( InputIt first, InputIt last, UnaryPredicate p );
(2)

Возвращает количество элементов в диапазоне [first, last), удовлетворяющих определенному условию. Первый вариант подсчитывает элементы, равные value, второй вариант подсчитывает элементы, для которых предикат p возвращает значение true.

Содержание

[править] Параметры

first, last диапазон элементов для проверки
value искомое значение
p унарный предикат, который возвращает​true для соответствующих элементов.

Определение функции предиката должно быть эквивалентно следующему:

 bool pred(const Type &a);

Присутствие const & в определении не обязательно, но функция не должна модифицировать передаваемые ей объекты.
Тип Type должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type. ​

Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.

[править] Возвращаемое значение

Количество элементов, удовлетворяющих условию.

[править] Сложность

Ровно last - first сравнения/применений предиката.

[править] Возможная реализация

Первый вариант
template<class InputIt, class T>
typename iterator_traits<InputIt>::difference_type
    count(InputIt first, InputIt last, const T& value)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (*first == value) {
            ret++;
        }
    }
    return ret;
}
Второй вариант
template<class InputIt, class UnaryPredicate>
typename iterator_traits<InputIt>::difference_type
    count_if(InputIt first, InputIt last, UnaryPredicate p)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (p(*first)) {
            ret++;
        }
    }
    return ret;
}

[править] Пример

Следующий код использует count чтобы определить, сколько целых чисел в std::vector'е соответствует указанному значению:

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    int data[] = { 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 };
    std::vector<int> v(data, data+10);
 
    int target1 = 3;
    int target2 = 5;
    int num_items1 = std::count(v.begin(), v.end(), target1);
    int num_items2 = std::count(v.begin(), v.end(), target2);
 
    std::cout << "число: " << target1 << " количество: " << num_items1 << '\n';
    std::cout << "число: " << target2 << " количество: " << num_items2 << '\n';
}

Вывод:

число: 3 количество: 2
число: 5 количество: 0

В этом примере используется лямбда-выражение для подсчёта элементов, делящихся на 3:

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    int data[] = { 1, 2, 3, 4, 4, 3, 7, 8, 9, 10 };
    std::vector<int> v(data, data+10);
 
    int num_items1 = std::count_if(v.begin(), v.end(), [](int i) {return i % 3 == 0;});
 
    std::cout << "количество чисел, делящихся на три: " << num_items1 << '\n';
}

Вывод:

количество чисел, делящихся на три: 3