Namespaces
Variants

std::experimental::ranges:: count, std::experimental::ranges:: count_if

From cppreference.net
**Примечание:** В данном фрагменте кода не содержится переводимого текста, так как весь контент состоит из: - HTML-тегов и атрибутов (сохранены без изменений) - C++ кода внутри тегов ` ` (не переводится согласно инструкциям) - Специфических C++ терминов (не переводятся) - Числовых маркеров "(3)" и технических обозначений "(ranges TS)" Все требования соблюдены - HTML структура и форматирование полностью сохранены.
Определено в заголовке <experimental/ranges/algorithm>
template < InputIterator I, Sentinel < I > S, class T, class Proj = ranges:: identity >

requires IndirectRelation < ranges:: equal_to <> , projected < I, Proj > , const T * >

ranges :: difference_type_t < I > count ( I first, S last, const T & value, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class T, class Proj = ranges:: identity >

requires IndirectRelation < ranges:: equal_to <> ,
projected < ranges:: iterator_t < R > , Proj > , const T * >
ranges :: difference_type_t < ranges:: iterator_t < R >>

count ( R && r, const T & value, Proj proj = Proj { } ) ;
(2) (ranges TS)
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < I, Proj >> Pred >

ranges :: difference_type_t < I > count_if ( I first, S last, Pred pred, Proj proj = Proj { } ) ;
(3) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < ranges:: iterator_t < R > , Proj >> Pred >
ranges :: difference_type_t < ranges:: iterator_t < R >>

count_if ( R && r, Pred pred, Proj proj = Proj { } ) ;
(4) (ranges TS)

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

1) Подсчитывает элементы, чьи проецируемые значения равны value (т.е., ranges:: invoke ( proj, * i ) == value ).
3) Подсчитывает элементы, чьи проецированные значения удовлетворяют предикату pred (т.е., ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) ) ! = false ).
2,4) То же, что (1,3) , но использует r в качестве исходного диапазона, как если бы использовались ranges:: begin ( r ) в качестве first и ranges:: end ( r ) в качестве last .

Несмотря на приведенные выше объявления, фактическое количество и порядок параметров шаблона для объявлений алгоритмов не определено. Таким образом, если при вызове алгоритма используются явные аргументы шаблона, программа, вероятно, является непереносимой.

Содержание

Параметры

first, last - диапазон элементов для проверки
r - диапазон элементов для проверки
value - значение для поиска
pred - предикат, применяемый к проецируемым элементам
proj - проекция, применяемая к элементам

Возвращаемое значение

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

Сложность

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

Примечания

Для количества элементов в диапазоне [ first , last ) без дополнительных критериев, смотрите ranges::distance .

Возможная реализация

Первая версия
template<InputIterator I, Sentinel<I> S, class T, class Proj = ranges::identity>
    requires IndirectRelation<ranges::equal_to<>, projected<I, Proj>, const T*>
ranges::difference_type_t<I> count(I first, S last, const T& value, Proj proj = Proj{})
{
    ranges::difference_type_t<I> ret = 0;
    for (; first != last; ++first)
        if (ranges::invoke(proj, *first) == value)
            ++ret;
    return ret;
}
Вторая версия
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
ranges::difference_type_t<I> count_if(I first, S last, Pred pred, Proj proj = Proj{})
{
    ranges::difference_type_t<I> ret = 0;
    for (; first != last; ++first)
        if (ranges::invoke(pred, ranges::invoke(proj, *i)))
            ++ret;
    return ret;
}

Пример

Смотрите также

возвращает количество элементов, удовлетворяющих определённым критериям
(шаблон функции)
возвращает расстояние между итератором и ограничителем, или между началом и концом диапазона
(шаблон функции)