std::ranges:: views:: drop, std::ranges:: drop_view
|
헤더에 정의됨
<ranges>
|
||
|
template
<
ranges::
view
V
>
class
drop_view
|
(1) | (C++20 이후) |
|
namespace
views
{
inline
constexpr
/* 지정되지 않음 */
drop
=
/* 지정되지 않음 */
;
|
(2) | (C++20 이후) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* 아래 참조 */
|
(C++20 이후) | |
|
template
<
class
DifferenceType
>
constexpr /* range adaptor closure */ drop ( DifferenceType && count ) ; |
(C++20 이후) | |
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:
-
(
(
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 의 특수화(specialization)인 경우; -
T그 외의 경우;
-
std::
span
<
typename
T
::
element_type
>
, 만약
|
(C++23부터) |
- 그렇지 않으면, drop_view ( e, f ) .
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) |
|
|
(C++26)
|
결과
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
>>
=
|
(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
를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뜁니다
(클래스 템플릿) (범위 어댑터 객체) |