Namespaces
Variants

std::experimental::ranges:: search_n

From cppreference.net
헤더 파일에 정의됨 <experimental/ranges/algorithm>
template < ForwardIterator I, Sentinel < I > S, class T,

class Pred = ranges:: equal_to <> , class Proj = ranges:: identity >
requires IndirectlyComparable < I, const T * , Pred, Proj >
I search_n ( I first, S last, ranges :: difference_type_t < I > count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class T, class Pred = ranges:: equal_to <> ,

class Proj = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R > , const T * , Pred, Proj >
ranges:: safe_iterator_t < R > search_n ( R && r,
ranges :: difference_type_t < ranges:: iterator_t < R >> count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) 범위 [ first , last ) 내에서 투영된 값이 주어진 값 value 와 술어 pred 에 따라 동일한 count 개의 요소로 이루어진 첫 번째 시퀀스를 검색합니다.
2) (1) 과 동일하지만, r 을 소스 범위로 사용하며, 마치 ranges:: begin ( r ) first 로, ranges:: end ( r ) last 로 사용하는 것과 같습니다.

목차

매개변수

first, last - 검사할 요소들의 범위
r - 검사할 요소들의 범위
count - 검색할 시퀀스의 길이
value - 검색할 값
pred - 투영된 요소들을 value 와 비교하는 조건자
proj - 요소들에 적용할 투영

반환값

범위 내에서 발견된 시퀀스의 시작을 가리키는 반복자 [ first , last ) . 해당 시퀀스를 찾지 못한 경우, last 와 동일하게 비교되는 반복자가 반환됩니다.

복잡도

최대 last - first 번의 술어(predicate)와 투영(projection) 적용.

가능한 구현

template<ForwardIterator I, Sentinel<I> S, class T,
         class Pred = ranges::equal_to<>, class Proj = ranges::identity>
    requires IndirectlyComparable<I, const T*, Pred, Proj>
I search_n(I first, S last, ranges::difference_type_t<I> count,
           const T& value, Pred pred = Pred{}, Proj proj = Proj{})
{
    for (; first != last; ++first)
    {
        if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
            continue;
        I candidate = first;
        ranges::difference_type_t<I> cur_count = 0;
        while (true)
        {
            ++cur_count;
            if (cur_count == count)
                // 성공
                return candidate;
            ++first;
            if (first == last)
                // 리스트 소진
                return first;
            if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
                // 연속된 개수가 부족함
                break;
        }
    {
    return first;
}

예제

참고 항목

범위에서 특정 요소가 연속적으로 지정된 횟수만큼 나타나는 첫 번째 위치를 검색합니다
(function template)
특정 범위에서 마지막으로 나타나는 요소 시퀀스를 찾습니다
(function template)
특정 조건을 만족하는 첫 번째 요소를 찾습니다
(function template)
요소들의 범위를 검색합니다
(function template)