Namespaces
Variants

std::ranges::contains, std::ranges::contains_subrange

cppreference.net에서
 
 
알고리즘 라이브러리
제약 알고리즘 및 범위 기반 알고리즘 (C++20)
제약 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에 대해)
집합 연산 (정렬된 범위에 대해)
병합 연산 (정렬된 범위에 대해)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
제약 알고리즘
이 메뉴의 모든 이름은 네임스페이스 std::ranges
에 속합니다.
(C++23)
unique_copy
stable_partition
partial_sort_copy
equal_range
set_symmetric_difference
pop_heap
clamp
prev_permutation
fold_left
fold_left_first  
fold_right
fold_right_last  
fold_left_with_iter
fold_left_first_with_iter
(C++23)
iota            
(C++23)
generate_random
(C++26)
uninitialized_value_construct_n
 
(C++23)<algorithm>
헤더
template< std::input_iterator I, std::sentinel_for<I> S,
          class T,
          class Proj = std::identity >
    requires std::indirect_binary_predicate
                 <ranges::equal_to, std::projected<I, Proj>, const T*>
constexpr bool contains( I first, S last, const T& value, Proj proj = {} );
에 정의됨 호출 시그니처
(1)
template< std::input_iterator I, std::sentinel_for<I> S,
          class Proj = std::identity,
          class T = std::projected_value_t<I, Proj> >
    requires std::indirect_binary_predicate
                 <ranges::equal_to, std::projected<I, Proj>, const T*>
constexpr bool contains( I first, S last, const T& value, Proj proj = {} );
(C++23부터)
template< ranges::input_range R,
          class T,
          class Proj = std::identity >
    requires std::indirect_binary_predicate
                 <ranges::equal_to,
                  std::projected<ranges::iterator_t<R>, Proj>, const T*>
constexpr bool contains( R&& r, const T& value, Proj proj = {} );
(C++26까지) (C++26부터)
(2)
template< ranges::input_range R,
          class Proj = std::identity,
          class T = std::projected_value_t<ranges::iterator_t<R>, Proj> >
    requires std::indirect_binary_predicate
                 <ranges::equal_to,
                  std::projected<ranges::iterator_t<R>, Proj>, const T*>
constexpr bool contains( R&& r, const T& value, Proj proj = {} );
(C++23부터)
template< std::forward_iterator I1, std::sentinel_for<I1> S1,
          std::forward_iterator I2, std::sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr bool contains_subrange( I1 first1, S1 last1, I2 first2, S2 last2,
                                  Pred pred = {},
                                  Proj1 proj1 = {}, Proj2 proj2 = {} );
(C++26까지) (C++26부터)
template< ranges::forward_range R1, ranges::forward_range R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable
                 <ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                  Pred, Proj1, Proj2>
constexpr bool contains_subrange( R1&& r1, R2&& r2, Pred pred = {},
                                  Proj1 proj1 = {}, Proj2 proj2 = {} );
(3) (C++23부터)
template< /*execution-policy*/ Ep,
          std::random_access_iterator I, std::sized_sentinel_for<I> S,
          class Proj = std::identity,
          class T = std::projected_value_t<I, Proj> >
    requires std::indirect_binary_predicate
                 <ranges::equal_to, std::projected<I, Proj>, const T*>
bool contains( Ep&& policy, I first, S last, const T& value, Proj proj = {} );
(4) (C++23부터)
template< /*execution-policy*/ Ep, /*sized-random-access-range*/ R,
          class Proj = std::identity,
          class T = std::projected_value_t<ranges::iterator_t<R>, Proj> >
    requires std::indirect_binary_predicate
                 <ranges::equal_to,
                  std::projected<ranges::iterator_t<R>, Proj>, const T*>
bool contains( Ep&& policy, R&& r, const T& value, Proj proj = {} );
(5) (C++26부터)
template< /*execution-policy*/ Ep,
          std::random_access_iterator I1, std::sized_sentinel_for<I1> S1,
          std::random_access_iterator I2, std::sized_sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
bool contains_subrange( Ep&& policy, I1 first1, S1 last1, I2 first2, S2 last2,
                        Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {} );
(6) (C++26부터)
template< /*execution-policy*/ Ep,
          /*sized-random-access-range*/ R1, /*sized-random-access-range*/ R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable
                 <ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                  Pred, Proj1, Proj2>
bool contains_subrange( Ep&& policy, R1&& r1, R2&& r2, Pred pred = {},
                        Proj1 proj1 = {}, Proj2 proj2 = {} );
(7) (C++26부터)

(8) /*execution-policy*/(C++26부터)의 정의는 이 페이지/*sized-random-access-range*/를 참조하십시오; 의 정의는 이 페이지

를 참조하십시오. value1,2)
소스 범위에 대상 값이 포함되어 있는지 확인합니다.1)[first, last) 소스 범위는
입니다.2)r 소스 범위는
입니다.3,4)
대상 범위가 소스 범위의 부분 범위인지 확인합니다.3)[first1, last1) 소스 범위는 [first2, last2)이고, 대상 범위는
입니다.4)r1 소스 범위는 r2이고, 대상 범위는
입니다.5-8) (1-4)와 동일하지만 policy에 따라 실행됩니다.

이 페이지에 설명된 함수형 엔터티는 알고리즘 함수 객체입니다(비공식적으로는 niebloids라고 함). 즉, 다음과 같습니다:

  • 이들 중 하나를 호출할 때 명시적 템플릿 인자 목록을 지정할 수 없습니다.
  • 이들 중 어느 것도 인자 종속 조회에 보이지 않습니다.
  • 이들 중 하나가 일반 비한정 조회에 의해 함수 호출 연산자 왼쪽의 이름으로 발견되면, 인자 종속 조회가 억제됩니다.

매개변수

first/first1, last/last1 - 소스를 정의하는 반복자-센티넬 쌍 범위
first2, last2 - 대상을 정의하는 반복자-센티넬 쌍 범위
r/r1 - 소스 범위
value - 대상 값
r2 - 대상 범위
pred/pred1 - 소스 범위의 (프로젝션된) 요소에 적용할 조건자
pred2 - 대상 범위의 (프로젝션된) 요소에 적용할 조건자
proj/proj1 - 소스 범위의 요소에 적용할 프로젝션
proj2 - 대상 범위의 요소에 적용할 프로젝션
policy - 사용할 실행 정책

반환 값

1) ranges::find(std::move(first), last, value, proj) != last
2) ranges::find(r, value, proj) != ranges::end(r)
3) first2 == last2 || !ranges::search(first1, last1, first2, last2, pred, proj1, proj2).empty()
4) ranges::empty(r2) || !ranges::search(r1, r2, pred, proj1, proj2).empty()
5-8) (1-4)와 동일하지만, std::forward<Ep>(policy)를 ranges::find 또는 ranges::search의 인수 목록에 첫 번째 인수로 삽입합니다.

복잡도

  • N은 ranges::distance(first, last) 또는 ranges::distance(r)로,
  • N1은 ranges::distance(first1, last1) 또는 ranges::distance(r1)로, 그리고
  • N2은 ranges::distance(first2, last2) 또는 ranges::distance(r2)로 주어졌을 때:
1,2) 최대 N 비교 및 proj 적용.
3,4) 최대 N1·N2 pred 및 proj 적용.
5,6) 𝓞(N) 비교 및 proj 적용.
7,8) 𝓞(N1·N2) pred 및 proj 적용.

예외

5-8) 실행 과정 중:
  • 병렬화에 필요한 임시 메모리 자원을 사용할 수 없는 경우, std::bad_alloc가 throw됩니다.
  • 알고리즘 인수를 통해 객체에 접근하는 동안 처리되지 않은 예외가 발생하면, 실행 정책에 따라 동작이 결정됩니다 (표준 정책, std::terminate가 호출됩니다).

참고

C++20에서는 contains을(를) ranges::find(haystack, needle) != ranges::end(haystack)으로(로) 또는 contains_subrange을(를) !ranges::search(haystack, needle).empty()으로(로) 구현할 수 있습니다.

ranges::contains_subrange, like ranges::search, and unlike std::search, has no support for 검색기 (such as std::boyer_moore_searcher).

기능 테스트 매크로 값 표준 기능
__cpp_lib_ranges_contains 202207L (C++23) ranges::contains 및 ranges::contains_subrange
__cpp_lib_algorithm_default_value_type 202403L (C++26) 리스트 초기화 알고리즘에 대한 (1,2)

가능한 구현

contains (1,2)
struct contains_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             class Proj = std::identity,
             class T = std::projected_value_t<I, Proj>>
    requires std::indirect_binary_predicate
                 <ranges::equal_to, std::projected<I, Proj>, const T*>
    constexpr bool operator()(I first, S last, const T& value, Proj proj = {}) const
    {
        return ranges::find(std::move(first), last, value, proj) != last;
    }
    
    template<ranges::input_range R,
             class Proj = std::identity,
             class T = std::projected_value_t<ranges::iterator_t<R>, Proj>>
    requires std::indirect_binary_predicate
                 <ranges::equal_to,
                  std::projected<ranges::iterator_t<R>, Proj>, const T*>
    constexpr bool operator()(R&& r, const T& value, Proj proj = {}) const
    {
        return ranges::find(r, value, proj) != ranges::end(r);
    }
};

inline constexpr contains_fn contains{};
contains_subrange (3,4)
struct contains_subrange_fn
{
    template<std::forward_iterator I1, std::sentinel_for<I1> S1,
             std::forward_iterator I2, std::sentinel_for<I2> S2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
    constexpr bool operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (first2 == last2) ||
                   !ranges::search(first1, last1, first2, last2,
                                   pred, proj1, proj2).empty();
    }
    
    template<ranges::forward_range R1, ranges::forward_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>, Pred, Proj1, Proj2>
    constexpr bool operator()(R1&& r1, R2&& r2, Pred pred = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return ranges::empty(r2) ||
                   !ranges::search(r1, r2, pred, proj1, proj2).empty();
    }
};

inline constexpr contains_subrange_fn contains_subrange{};

예제

#include <algorithm>
#include <array>
#include <complex>
namespace ranges = std::ranges;
int main()
{
    constexpr auto haystack = std::array{3, 1, 4, 1, 5};
    constexpr auto needle = std::array{1, 4, 1};
    constexpr auto bodkin = std::array{2, 5, 2};
    static_assert
    (
        ranges::contains(haystack, 4) &&
       !ranges::contains(haystack, 6) &&
        ranges::contains_subrange(haystack, needle) &&
       !ranges::contains_subrange(haystack, bodkin)
    );
    constexpr std::array<std::complex<double>, 3> nums{{{1, 2}, {3, 4}, {5, 6}}};
    #ifdef __cpp_lib_algorithm_default_value_type
        static_assert(ranges::contains(nums, {3, 4}));
    #else
        static_assert(ranges::contains(nums, std::complex<double>{3, 4}));
    #endif
}

참고 항목

특정 기준을 만족하는 첫 번째 요소를 찾습니다
(알고리즘 함수 객체)
요소 범위의 첫 번째 발생을 검색합니다
(알고리즘 함수 객체)
이진 탐색을 사용하여 범위에 요소가 존재하는지 확인합니다
(알고리즘 함수 객체)
하나의 시퀀스가 다른 시퀀스의 부분 시퀀스인지 확인합니다
(알고리즘 함수 객체)
범위 내 모든 요소, 어떤 요소, 또는 어떤 요소에도 조건자가 true인지 확인합니다
(알고리즘 함수 객체)