std::ranges::views::take, std::ranges::take_view
| 헤더 <ranges>
|
||
template< ranges::view V >
class take_view
: public ranges::view_interface<take_view<V>>
|
에 정의됨 (1) | (C++20부터) |
namespace views {
inline constexpr /* unspecified */ take = /* unspecified */;
}
|
(2) | (C++20부터) |
| 호출 서명 |
||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto
take( R&& r, ranges::range_difference_t<R> count );
|
(C++20부터) | |
template< class DifferenceType >
constexpr /* range adaptor closure */ take( DifferenceType&& count );
|
(C++20부터) | |
views::take는 RangeAdaptorObject입니다. 표현식 views::take(e, f)은 f의 처음 e개 요소를 나타내는 뷰를 생성합니다. 결과가 take_view일 필요는 없습니다.
views::take(e, f)는 (expression-equivalent)입니다. (여기서 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의 특수화라면;T, 만약T가 std::basic_string_view의 특수화라면;ranges::subrange<ranges::iterator_t<T>>, 만약T가 ranges::subrange의 특수화라면;
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)입니다.
decltype((f))는 std::convertible_to<D>을 모델링해야 합니다.take_view 밑에 있는 뷰 contiguous_range, random_access_range, bidirectional_range, forward_range, input_range, 및 sized_range 개념들을 각각 모델링할 때 해당 개념들을 모델링합니다. 밑에 있는 뷰 V가 common_range이 되는 경우는 밑에 있는 뷰 V가 random_access_range와 sized_range를 모두 모델링할 때입니다.
데이터 멤버
| 멤버 | 설명 |
V
base_
|
기반 뷰
( 설명 전용 멤버 객체* ) |
ranges::
range_difference_t
<
V
>
count_
|
취할 요소의 개수
( 설명 전용 멤버 객체* ) |
멤버 함수
take_view
를 생성합니다
(public 멤버 함수) |
|
|
기본(적응된) 뷰의 복사본을 반환합니다
(public 멤버 함수) |
|
|
시작을 가리키는 반복자를 반환합니다
(public 멤버 함수) |
|
|
끝을 가리키는 반복자나 센티널을 반환합니다
(public 멤버 함수) |
|
기본(적응된) 범위가
sized_range
를 만족할 때만 요소의 개수를 반환합니다
(public 멤버 함수) |
|
|
(C++26)
|
결과
approximately_sized_range
의 대략적인 크기를 반환합니다
(public 멤버 함수) |
ranges::view_interface | |
| empty파생된 뷰가 비어 있는지 반환하며, sized_range 또는 forward_range std::ranges::view_interface<D>를 만족하는 경우에만 제공됨(
| |
cbegin |
(C++23) 범위의 시작을 가리키는 상수 반복자를 반환함 std::ranges::view_interface<D>(
|
cend |
(C++23) 범위의 상수 반복자에 대한 끝점 표시기를 반환함 std::ranges::view_interface<D>(
|
| operator bool파생된 뷰가 비어 있지 않은지 반환하며, 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>의 공개 멤버 함수)
| |
추론 가이드
중첩 클래스
|
(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)
|
지정된 개수의 요소들을 새로운 위치로 복사함
(알고리즘 함수 객체) |