Namespaces
Variants

std::ranges:: views:: drop_while, std::ranges:: drop_while_view

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

requires ranges:: input_range < V > &&
std:: is_object_v < Pred > &&
std:: indirect_unary_predicate < const Pred, ranges:: iterator_t < V >>
class drop_while_view

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

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

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

requires /* 아래 참조 */

constexpr ranges:: view auto drop_while ( R && r, Pred && pred ) ;
(C++20 이후)
template < class Pred >
constexpr /*레인지 어댑터 클로저*/ drop_while ( Pred && pred ) ;
(C++20 이후)
1) 기본 시퀀스에서 predicate가 false 를 반환하는 첫 번째 요소부터 시작하는 요소들의 view 를 나타내는 range adaptor.
2) RangeAdaptorObject . 표현식 views :: drop_while ( e, f ) 표현식 동등 합니다 drop_while_view ( e, f ) 에 대해, 적절한 부분표현식 e f 가 주어졌을 때.

drop_while_view 는 기본 뷰 V 가 해당 개념들을 모델링할 때 contiguous_range , random_access_range , bidirectional_range , forward_range , input_range , 그리고 common_range 개념들을 모델링합니다. 또한 ranges:: forward_range < V > std:: sized_sentinel_for < ranges:: sentinel_t < V > , ranges:: iterator_t < V >> 가 모델링될 경우 sized_range 도 모델링합니다.

목차

데이터 멤버

멤버 설명
V base_ (private) 기반 뷰
( 설명 전용 멤버 객체* )
copyable-box <Pred> (until C++23) movable-box <Pred> (since C++23) pred_ (private) 기반 함수 객체
( 설명 전용 멤버 객체* )
non-propagating-cache < ranges:: iterator_t < V >> cache_ (private)
( V forward_range 를 만족할 때만 존재함)
begin() 의 결과를 캐시하는 객체
( 설명 전용 멤버 객체* )

멤버 함수

drop_while_view 를 생성합니다
(public member function)
기본 (적응된) 뷰의 복사본을 반환합니다
(public member function)
저장된 predicate에 대한 참조를 반환합니다
(public member function)
시작 부분을 가리키는 반복자를 반환합니다
(public member function)
끝 부분을 가리키는 반복자 또는 sentinel을 반환합니다
(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)
범위의 상수 반복자에 대한 sentinel을 반환합니다
( 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 를 만족하고, sentinel과 반복자 타입이 sized_sentinel_for 를 만족하는 경우 제공됩니다
( 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, class Pred >

constexpr bool enable_borrowed_range < std :: ranges :: drop_while_view < T, Pred >> =

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

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

참고 사항

range 개념이 요구하는 분할 상환 상수 시간 복잡도를 제공하기 위해, begin 의 결과는 drop_while_view 객체 내부에 캐시됩니다. 기본 범위가 begin() 의 첫 호출 후 수정되는 경우, drop_while_view 객체의 후속 사용은 직관적이지 않은 동작을 보일 수 있습니다.

예제

#include <iostream>
#include <ranges>
#include <string>
#include <string_view>
using std::operator""sv;
[[nodiscard]]
constexpr bool is_space(char p) noexcept
{
    auto ne = [p](auto q) { return p != q; };
    return !!(" \t\n\v\r\f" | std::views::drop_while(ne));
};
[[nodiscard("trims the output")]]
constexpr std::string_view trim_left(std::string_view const in) noexcept
{
    auto view = in | std::views::drop_while(is_space);
    return {view.begin(), view.end()};
}
[[nodiscard("trims the output")]]
constexpr std::string trim(std::string_view const in)
{
    auto view = in
              | std::views::drop_while(is_space)
              | std::views::reverse
              | std::views::drop_while(is_space)
              | std::views::reverse
              ;
    return {view.begin(), view.end()};
}
int main()
{
    static_assert(trim_left(" \n C++23") == "C++23"sv);
    constexpr auto src{" \f\n\t\r\vHello, C++20!\f\n\t\r\v "sv};
    static_assert(trim(src) == "Hello, C++20!");
    static constexpr auto v = {0, 1, 2, 3, 4, 5};
    for (int n : v | std::views::drop_while([](int i) { return i < 3; }))
        std::cout << n << ' ';
    std::cout << '\n';
}

출력:

3 4 5

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3494 C++20 drop_while_view 는 절대 borrowed_range 가 아니었음 기본 뷰가 borrowed_range 인 경우 이 또한 borrowed_range

참고 항목

다른 view 의 요소들로 구성되며, 처음 N개 요소를 건너뛴 view
(클래스 템플릿) (레인지 어댑터 객체)