Namespaces
Variants

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

From cppreference.net
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;
}

示例

参见

返回满足特定条件的元素数量
(函数模板)
返回迭代器与哨位之间的距离,或范围起始与末尾之间的距离
(函数模板)