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 - 투영된 원소들에 적용할 predicate
proj - 원소들에 적용할 projection

반환값

조건을 만족하는 요소의 개수.

복잡도

정확히 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;
}

예제

참고 항목

특정 조건을 만족하는 요소의 개수를 반환합니다
(함수 템플릿)
반복자와 센티넬 사이의 거리, 또는 범위의 시작과 끝 사이의 거리를 반환합니다
(함수 템플릿)