Namespaces
Variants

std::ranges::views::take, std::ranges::take_view

cppreference.net에서 가져옴
 
 
Ranges 라이브러리
Range 어댑터
 
 
헤더 <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부터)
1) 밑에 있는 시퀀스의 처음부터 시작하여 주어진 경계에서 끝나는 요소들의 view를 나타내는 범위 어댑터입니다.
2) 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를 모두 모델링한다면;
  • views::repeat(*e.value_, std::min<D>(ranges::distance(e), f)), 만약 T가 sized_range를 모델링한다면; 이 경우 e은 한 번만 평가됩니다;
  • views::repeat(*e.value_, static_cast<D>(e)) 그렇지 않으면;
(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 멤버 함수)
결과 approximately_sized_range 의 대략적인 크기를 반환합니다
(public 멤버 함수)
ranges::view_interface
empty파생된 뷰가 비어 있는지 반환하며, sized_range 또는
forward_rangestd::ranges::view_interface<D>를 만족하는 경우에만 제공됨(
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환함std::ranges::view_interface<D>(
(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 >> =

ranges:: enable_borrowed_range < 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 인 경우
해당 범위가 됨

참고 항목

반복자와 개수로부터 서브레인지를 생성함
(커스터마이제이션 포인트 객체)
다른 view 의 초기 요소들로 구성된 view 로, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (레인지 어댑터 객체)
지정된 개수의 요소들을 새로운 위치로 복사함
(알고리즘 함수 객체)