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

std::count, std::count_if

Материал из cppreference.com
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
all_of
any_of
none_of
(C++11)
(C++11)
(C++11)
for_each
count
count_if
mismatch
equal
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Заголовочный файл <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 - unary predicate which returns ​true для соответствующих элементов.

The signature of the predicate function should be equivalent to the following:

bool pred(const Type &a);

The signature does not need to have const &, but the function must not modify the objects passed to it.
The type Type must be such that an object of type InputIt can be dereferenced and then implicitly converted to Type. ​

Type requirements
-
InputIt must meet the requirements of InputIterator.

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

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

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

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

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

First version
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;
}
Second version
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 чтобы определить, сколько целых чисел в векторе соответствует указанному значению:

#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