Namespaces
Variants

std::ranges::views::drop, std::ranges::drop_view

cppreference.net에서
 
 
범위 라이브러리
범위 어댑터
 
 
헤더 <ranges>
template< ranges::view V >
class drop_view
    : public ranges::view_interface<drop_view<V>>
에 정의됨 (1) (C++20부터)
namespace views {
    inline constexpr /* unspecified */ drop = /* unspecified */;
}
(2) (C++20부터)
호출 시그니처
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto
    drop( R&& r, ranges::range_difference_t<R> count );
(C++20부터)
template< class DifferenceType >
constexpr /* range adaptor closure */ drop( DifferenceType&& count );
(C++20부터)
1) 기본 시퀀스의 요소로 구성된 범위 어댑터로, 처음 N개의 요소를 건너뜁니다.
2) RangeAdaptorObject. T이(가) std::remove_cvref_t<decltype((e))>이고 D이(가) ranges::range_difference_t<decltype((e))>인 경우), 표현식 views::drop(e, f)은(는) expression-equivalent입니다:
  • ((void)f, decay-copy(e)) (T이(가) ranges::empty_view인 경우, 단 e과 f의 평가는 순서가 결정되지 않습니다;)
  • 그렇지 않으면 T(ranges::begin(e) + inc, ranges::end(e),
    /*to-unsigned-like*/(ranges::distance(e) - inc))
    (T이(가) ranges::subrange의 특수화이고 random_access_range와 sized_range를 모두 모델하며, T이 크기를 저장해야 하는 경우 (자세한 내용은 ranges::subrange::subrange() 참조), 여기서 inc은(는) std::min<D>(ranges::distance(e), f)임);
  • 그렇지 않으면 U(ranges::begin(e) + inc, ranges::end(e)) (T이(가) std::span, std::basic_string_view, ranges::iota_view, 또는 ranges::subrange의 특수화이고 random_access_range와 sized_range를 모두 모델하며, 여기서 U은(는)
  • std::span<typename T::element_type>임, T이(가) std::span의 특수화인 경우;
  • T 그렇지 않음);
  • views::repeat(*e.value_, ranges::distance(e) - inc) (T이(가) sized_range를 모델하는 경우; 이 경우 e은 한 번만 평가됩니다;)
  • ((void)e, auto(f)) 그렇지 않으면 (단, e과 f의 평가는 순서가 결정되지 않습니다);
(C++23부터)
  • 그렇지 않으면 drop_view(e, f).
모든 경우에서 decltype((f))은(는) std::convertible_to<D>를 모델해야 합니다.

drop_view은(는) 기본 뷰 contiguous_range, random_access_range, bidirectional_range, forward_range, input_range, common_range, sized_range 개념을 각각 모델할 때 해당 개념들을 모델합니다. V

데이터 멤버

멤버 설명
V base_ (비공개) 기반 뷰
(설명 전용 멤버 객체*)
ranges::range_difference_t<V> count_ (비공개) 건너뛸 요소의 개수
(설명 전용 멤버 객체*)
비전파 캐시<ranges::iterator_t<V>> cache_ (비공개)
(다음 조건을 만족할 때만 존재: V가 forward_range
를 만족하지만 random_access_range 및 sized_range는 만족하지 않는 경우)
호출 결과를 캐시하는 객체 begin()
(설명 전용 멤버 객체*)

멤버 함수

drop_view 를 생성합니다
(public member function)
기본(적응된) 뷰의 복사본을 반환합니다
(public member function)
시작 부분을 가리키는 반복자를 반환합니다
(public member function)
끝 부분을 가리키는 반복자나 센티널을 반환합니다
(public member function)
기본(적응된) 범위가 sized_range 를 만족하는 경우에만 요소의 개수를 반환합니다
(public member function)
결과 approximately_sized_range 의 대략적인 크기를 반환합니다
(public member function)
상속됨: ranges::view_interface
파생 뷰가 비어 있는지 여부를 반환합니다. 단, sized_range 또는 forward_range
을 만족하는 경우에만 가능합니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
(C++23)
범위의 시작 부분에 대한 상수 반복자를 반환합니다.
(std::ranges::view_interface<D>의 공개 멤버 함수)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다.
(std::ranges::view_interface<D>의 공개 멤버 함수)
파생 뷰가 비어 있지 않은지 여부를 반환합니다. 단, ranges::empty가 적용 가능한 경우에만 가능합니다.
(std::ranges::view_interface<D>의 공개 멤버 함수)
파생 뷰 데이터의 주소를 가져옵니다. 단, 반복자 유형이 contiguous_iterator
을 만족하는 경우에만 가능합니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
파생 뷰의 첫 번째 요소를 반환합니다. 단, forward_range
을 만족하는 경우에만 가능합니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
파생 뷰의 마지막 요소를 반환합니다. 단, bidirectional_range 및 common_range
을 만족하는 경우에만 가능합니다. (std::ranges::view_interface<D>의 공개 멤버 함수)
는 파생 뷰의 n번째 요소를 반환합니다. 단, random_access_range
을 만족하는 경우에만 가능합니다. (std::ranges::view_interface<D>의 공개 멤버 함수)

추론 가이드

헬퍼 템플릿

template < class T >

constexpr bool enable_borrowed_range < std :: ranges :: drop_view < T >> =

ranges:: enable_borrowed_range < T > ;
(C++20 이후)

ranges::enable_borrowed_range 의 이 특수화는 기본 뷰가 이를 만족할 때 drop_view 가 borrowed_range 를 만족하도록 합니다.

예제

#include <initializer_list>
#include <iostream>
#include <ranges>
int main()
{
    const auto nums = {1, 2, 3, 4, 5, 6, 7};
    std::cout << "drop " << 2 << ": ";
    for (int i : std::ranges::drop_view{nums, 2})
        std::cout << i << ' ';
    std::cout << '\n';
    std::cout << "drop " << 3 << ": ";
    for (int i : nums | std::views::drop(3))
        std::cout << i << ' ';
    std::cout << '\n';
    std::cout << "drop " << 4 << ": ";
    for (int i : std::views::iota(1, 8) | std::views::drop(4))
        std::cout << i << ' ';
    std::cout << '\n';
    // 요소 수보다 더 많이 drop하는 것도 문제없음:
    for (int dp : {5, 6, 7, 890, 100500})
    {
        std::cout << "drop " << dp << ": ";
        for (int i : std::views::iota(1, 8) | std::views::drop(dp))
            std::cout << i << ' ';
        std::cout << '\n';
    }
}

출력:

drop 2: 3 4 5 6 7
drop 3: 4 5 6 7
drop 4: 5 6 7
drop 5: 6 7
drop 6: 7
drop 7:
drop 890: 
drop 100500:

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3407 C++20 views::drop 가 크기가 있는 임의 접근 범위 생성에
실패하는 경우가 있음
항상 유효하도록 생성 방식이
조정됨
LWG 3494 C++20 drop_view 가 borrowed_range 가 아닌 경우 기본 뷰가 borrowed_range 인 경우 해당됨

참고 항목

다른 view 의 요소들로 구성된 view 로, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뜁니다
(클래스 템플릿) (범위 어댑터 객체)