std::ranges::views::drop, std::ranges::drop_view
| 헤더 <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부터) | |
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그렇지 않음);
|
(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) |
|
|
(C++26)
|
결과
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
>>
=
|
(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
를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뜁니다
(클래스 템플릿) (범위 어댑터 객체) |