Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
헤더에 정의됨 <ranges>
template < ranges:: view V >

class drop_view

: public ranges:: view_interface < drop_view < V >>
(1) (C++20 이후)
namespace views {

inline constexpr /* 지정되지 않음 */ drop = /* 지정되지 않음 */ ;

}
(2) (C++20 이후)
호출 시그니처
template < ranges:: viewable_range R >

requires /* 아래 참조 */
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 . Given T is std:: remove_cvref_t < decltype ( ( e ) ) > and D is ranges:: range_difference_t < decltype ( ( e ) ) > ), the expression views :: drop ( e, f ) is 표현식-동등 to:
  • std:: span < typename T :: element_type > , 만약 T std:: span 의 특수화(specialization)인 경우;
  • 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 ) .
In all cases, decltype ( ( f ) ) must model std:: convertible_to < D > .

drop_view 는 기본 뷰 V 가 해당 개념들을 모델링할 때 contiguous_range , random_access_range , bidirectional_range , forward_range , input_range , common_range , 그리고 sized_range 개념들을 모델링합니다.

목차

데이터 멤버

멤버 설명
V base_ (private) 기반 뷰
( 설명 전용 멤버 객체* )
ranges:: range_difference_t < V > count_ (private) 건너뛸 요소의 개수
( 설명 전용 멤버 객체* )
non-propagating-cache < ranges:: iterator_t < V >> cache_ (private)
( 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)
std::ranges::view_interface 로부터 상속됨
파생된 뷰가 비어 있는지 여부를 반환합니다. sized_range forward_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰가 비어 있지 않은지 여부를 반환합니다. ranges::empty 가 적용 가능한 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 데이터 주소를 가져옵니다. 반복자 타입이 contiguous_iterator 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 첫 번째 요소를 반환합니다. forward_range 를 만족하는 경우에 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 마지막 요소를 반환합니다. bidirectional_range common_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 n 번째 요소를 반환합니다. random_access_range 를 만족하는 경우에만 제공됩니다
( std::ranges::view_interface<D> 의 public member function)

추론 가이드

헬퍼 템플릿

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 를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뜁니다
(클래스 템플릿) (범위 어댑터 객체)