std::ranges:: views:: take, std::ranges:: take_view
|
헤더에 정의됨
<ranges>
|
||
|
template
<
ranges::
view
V
>
class
take_view
|
(1) | (C++20부터) |
|
namespace
views
{
inline
constexpr
/* unspecified */
take
=
/* unspecified */
;
|
(2) | (C++20부터) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* see below */
|
(C++20부터) | |
|
template
<
class
DifferenceType
>
constexpr /* range adaptor closure */ take ( DifferenceType && count ) ; |
(C++20부터) | |
view
를 나타내는 범위 어댑터.
views::take
is a
RangeAdaptorObject
. The expression
views
::
take
(
e, f
)
results in a view that represents the first
f
elements from
e
. The result is not necessarily a
take_view
.
views
::
take
(
e, f
)
는 다음 표현식과
표현식 동등
합니다 (여기서
T
는
std::
remove_cvref_t
<
decltype
(
(
e
)
)
>
이고
D
는
ranges::
range_difference_t
<
decltype
(
(
e
)
)
>
입니다):
-
(
(
void
)
f,
decay-copy ( e ) ) , 만약T가 ranges:: empty_view 인 경우, 단 e 와 f 의 평가 순서는 비결정적임; -
U
(
ranges::
begin
(
e
)
,
ranges::
begin
(
e
)
+
std::
min
<
D
>
(
ranges::
distance
(
e
)
, f
)
)
, 만약
T가 std:: span , std::basic_string_view , 또는 ranges:: subrange 의 특수화이며random_access_range와sized_range를 모두 만족하는 경우, 여기서U는
-
-
std::
span
<
typename
T
::
element_type
>
, 만약
T가 std:: span 의 특수화(specialization)인 경우; -
T, 만약T가 std::basic_string_view 의 특수화(specialization)인 경우; -
ranges::
subrange
<
ranges::
iterator_t
<
T
>>
, 만약
T가 ranges:: subrange 의 특수화(specialization)인 경우;
-
std::
span
<
typename
T
::
element_type
>
, 만약
-
ranges::
iota_view
(
*
ranges::
begin
(
e
)
,
* ( ranges:: begin ( e ) + std:: min < D > ( ranges:: distance ( e ) , f ) ) ) , 만약T가 ranges:: iota_view 의 특수화이며random_access_range와sized_range를 모두 모델링하는 경우;
|
(C++23부터) |
- 그렇지 않으면, take_view ( e, f ) .
take_view
는 기본 뷰
V
가 해당 개념들을 모델링할 때
contiguous_range
,
random_access_range
,
bidirectional_range
,
forward_range
,
input_range
, 그리고
sized_range
개념들을 모델링합니다. 기본 뷰
V
가
random_access_range
와
sized_range
를 모두 모델링할 때
common_range
를 모델링합니다.
목차 |
데이터 멤버
| 멤버 | 설명 |
V
base_
|
기반 뷰
( 설명 전용 멤버 객체* ) |
ranges::
range_difference_t
<
V
>
count_
|
취할 요소의 개수
( 설명 전용 멤버 객체* ) |
멤버 함수
take_view
를 생성합니다
(public 멤버 함수) |
|
|
기본(적응된) 뷰의 복사본을 반환합니다
(public 멤버 함수) |
|
|
시작을 가리키는 반복자를 반환합니다
(public 멤버 함수) |
|
|
끝을 가리키는 반복자나 센티널을 반환합니다
(public 멤버 함수) |
|
기본(적응된) 범위가
sized_range
를 만족할 때만 요소의 개수를 반환합니다
(public 멤버 함수) |
|
|
(C++26)
|
결과
approximately_sized_range
의 대략적인 크기를 반환합니다
(public 멤버 함수) |
std::ranges::view_interface 로부터 상속됨 |
|
파생 뷰가
sized_range
나
forward_range
를 만족할 때만 비어 있는지 여부를 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
|
(C++23)
|
범위의 시작을 가리키는 상수 반복자를 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
(C++23)
|
범위의 상수 반복자에 대한 센티널을 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
ranges::empty
가 적용 가능할 때만 파생 뷰가 비어 있지 않은지 여부를 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
반복자 타입이
contiguous_iterator
를 만족할 때만 파생 뷰의 데이터 주소를 가져옵니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
forward_range
를 만족할 때 파생 뷰의 첫 번째 요소를 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
bidirectional_range
와
common_range
를 만족할 때만 파생 뷰의 마지막 요소를 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
random_access_range
를 만족할 때만 파생 뷰의
n
번째
요소를 반환합니다
(
std::ranges::view_interface<D>
의 public 멤버 함수)
|
|
추론 가이드
중첩 클래스
|
(C++20)
|
센티널 타입
( 설명 전용 멤버 클래스 템플릿* ) |
헬퍼 템플릿
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
take_view
<
T
>>
=
|
(C++20부터) | |
ranges::enable_borrowed_range
의 이 특수화는 기본 뷰가 이를 만족할 때
take_view
가
borrowed_range
를 만족하도록 합니다.
예제
#include <algorithm> #include <iostream> #include <ranges> int main() { namespace views = std::views; auto print = [](char x){ std::cout << x; }; for (const char nums[]{'1', '2', '3'}; int n : views::iota(0, 5)) { std::cout << "take(" << n << "): "; // 안전하게 최대 min(n, nums.size()) 개의 요소만 취함: std::ranges::for_each(nums | views::take(n), print); std::cout << '\n'; } }
출력:
take(0): take(1): 1 take(2): 12 take(3): 123 take(4): 123
결함 보고서
다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3407 | C++20 |
views::take
가 크기가 있는 임의 접근 범위 생성에
실패하는 경우가 있음 |
결과 타입이 조정되어
생성이 항상 유효하도록 함 |
| LWG 3494 | C++20 |
take_view
가
borrowed_range
가 아닌 경우
|
기본 뷰가
borrowed_range
인 경우
해당 범위가 됨 |
참고 항목
|
(C++20)
|
반복자와 개수로부터 서브레인지를 생성함
(커스터마이제이션 포인트 객체) |
다른
view
의 초기 요소들로 구성된
view
로, 술어(predicate)가
false
를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (레인지 어댑터 객체) |
|
|
(C++20)
|
지정된 개수의 요소들을 새로운 위치로 복사함
(알고리즘 함수 객체) |