Namespaces
Variants

std::experimental::ranges:: find, std::experimental::ranges:: find_if, std::experimental::ranges:: find_if_not

From cppreference.net
헤더 파일에 정의됨 <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 * >

I find ( 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:: safe_iterator_t < R > find ( 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 >

I find_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:: safe_iterator_t < R > find_if ( R && r, Pred pred, Proj proj = Proj { } ) ;
(4) (ranges TS)
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < I, Proj >> Pred >

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

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

ranges:: safe_iterator_t < R > find_if_not ( R && r, Pred pred, Proj proj = Proj { } ) ;
(6) (ranges TS)

범위 [ first , last ) 내에서 특정 조건을 만족하는 첫 번째 요소를 반환합니다:

1) find 는 투영된 값이 value 와 동일한 요소를 검색합니다 (즉, value == ranges:: invoke ( proj, * i ) ).
3) find_if 는 투영된 값에 대해 조건자 p true 를 반환하는 요소를 검색합니다 (즉, ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) ) )가 true 인 경우).
5) find_if_not 는 투영된 값에 대해 조건자 q false 를 반환하는 요소를 검색합니다 (즉, ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) ) )가 false 인 경우).
2,4,6) (1,3,5) 와 동일하지만, r 를 소스 범위로 사용하며, 마치 ranges:: begin ( r ) first 로, ranges:: end ( r ) last 로 사용하는 것과 같습니다.

위에 설명된 선언들과는 별개로, 알고리즘 선언에 대한 실제 템플릿 매개변수의 개수와 순서는 명시되지 않습니다. 따라서 알고리즘을 호출할 때 명시적 템플릿 인수를 사용하는 경우, 해당 프로그램은 이식성이 없을 가능성이 높습니다.

목차

매개변수

first, last - 검사할 요소의 범위
r - 검사할 요소의 범위
value - 투영된 요소와 비교할 값
pred - 투영된 요소에 적용할 predicate
proj - 요소에 적용할 projection

반환값

조건을 만족하는 첫 번째 요소에 대한 반복자. 해당하는 요소가 없으면 last 와 동일하게 비교되는 반복자를 반환합니다.

복잡도

최대 last - first 번의 predicate 및 projection 적용.

가능한 구현

첫 번째 버전
template<InputIterator I, Sentinel<I> S, class T, class Proj = ranges::identity>
    requires IndirectRelation<ranges::equal_to<>, projected<I, Proj>, const T*>
I find(I first, S last, const T& value, Proj proj = Proj{})
{
    for (; first != last; ++first)
        if (ranges::invoke(proj, *first) == value)
            break;
    return first;
}
두 번째 버전
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
I find_if(I first, S last, Pred pred, Proj proj = Proj{})
{
    for (; first != last; ++first)
        if (ranges::invoke(pred, ranges::invoke(proj, *first)))
            break;
    return first;
}
세 번째 버전
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
I find_if_not(I first, S last, Pred pred, Proj proj = Proj{})
{
    for (; first != last; ++first)
        if (!ranges::invoke(pred, ranges::invoke(proj, *first)))
            break;
    return first;
}

예제

참고 항목

특정 기준을 만족하는 첫 번째 요소를 찾음
(함수 템플릿)
서로 같거나(또는 주어진 조건자를 만족하는) 첫 번째 인접한 두 항목을 찾음
(함수 템플릿)
특정 범위에서 마지막 요소 시퀀스를 찾음
(함수 템플릿)
요소 집합 중 하나를 검색함
(함수 템플릿)
두 범위가 처음으로 달라지는 위치를 찾음
(함수 템플릿)
요소들의 범위를 검색함
(함수 템플릿)