Namespaces
Variants

std::ranges::views::adjacent_transform, std::ranges::adjacent_transform_view, std::ranges::views::pairwise_transform

cppreference.net에서 가져옴
 
 
범위 라이브러리
범위 어댑터
 
 
다음 헤더에 정의됨 <ranges>
template< ranges::forward_range V, std::move_constructible F, std::size_t N >
  requires ranges::view<V> && (N > 0) && std::is_object_v<F> &&
           std::regular_invocable<F&,
               /*REPEAT*/(ranges::range_reference_t<V>, N)...> &&
           /*can-reference*/<std::invoke_result_t<F&,
               /*REPEAT*/(ranges::range_reference_t<V>, N)...>>
class adjacent_transform_view
    : public ranges::view_interface<adjacent_transform_view<V, F, N>>
(1) (C++23부터)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ adjacent_transform = /* unspecified */;
}
(2) (C++23부터)
namespace views {
    inline constexpr auto pairwise_transform = adjacent_transform<2>;
}
(3) (C++23부터)
호출 서명
template< ranges::viewable_range R, class F >
    requires /* see below */
constexpr ranges::view auto adjacent_transform<N>( R&& r, F&& fun );
(C++23부터)
template< class F >
constexpr /*range adaptor closure*/ adjacent_transform<N>( F&& fun );
(C++23부터)
1) adjacent_transform_view는 view와 호출 가능 객체 fun를 받아, view를 생성하는 범위 어댑터입니다. 생성된 뷰의 i번째 요소는 fun을(를) 원본 뷰의 각 [i, i + N)개 요소에 적용한 결과입니다. F는 항상 항(arity) N를 가집니다.
원본 뷰의 크기를 S이라고 할 때, 생성된 뷰의 크기는 다음과 같습니다:
  • S - N + 1, 만약 S >= N이면,
  • 0 그렇지 않으면, 결과 뷰는 비어 있습니다.
2) 이름 views::adjacent_transform<N>은(는) RangeAdaptorObject를 나타냅니다. 부분 표현식 e와 f, 그리고 상수 표현식 N이 주어졌을 때, 표현식 views::adjacent_transform<N>(e, f)은(는) 다음에 대해 표현식-동등(expression-equivalent)합니다:
  • ((void)e, views::zip_transform(f)), 만약 N이 0와 같고 decltype((e))가 forward_range의 모델인 경우 (단, e와 f의 평가는 비결정적 순서(indeterminately sequenced)입니다),
  • adjacent_transform_view<views::all_t<decltype((e))>, std::decay_t<decltype((f))>, N>(e, f) 그렇지 않으면.
3) 이름 views::pairwise_transform은(는) RangeAdaptorObject를 나타내며 views::adjacent_transform<2>와 정확히 동일하게 동작합니다. 특히, F의 항수(arity)도 2이며 fun는 이진 호출 가능 객체입니다.

adjacent_transform_view는 항상 forward_range의 모델이며, 적응된 view 타입이 해당 개념의 모델인 경우 bidirectional_range, random_access_range, 또는 sized_range의 모델이기도 합니다.

멤버 함수

adjacent_transform_view 를 생성합니다
(public member function)
시작 부분에 대한 반복자를 반환합니다
(public member function)
끝 부분에 대한 반복자나 센티널을 반환합니다
(public member function)
기본(적응된) 범위가 sized_range 를 만족하는 경우에만 요소의 개수를 반환합니다
(public member function)
결과 approximately_sized_range 의 대략적인 크기를 반환합니다
(public member function)
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>
파생된 뷰가 비어 있지 않은지 반환하며, 이는 ranges::empty를 적용할 수 있는 경우에만 제공됩니다.(
의 공개 멤버 함수)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>의 공개 멤버 함수)

중첩 타입

유형 정의
InnerView (비공개) ranges:: adjacent_view < V, N >
( 설명 전용 멤버 유형* )
inner_iterator (비공개)
inner_sentinel (비공개)

데이터 멤버

멤버 설명
/*movable-box*/ < F > fun_ (private) 변환 가능 호출 객체
( 설명 전용 멤버 객체* )
ranges:: adjacent_view < V,N > inner_ (private) 저장된 뷰
( 설명 전용 멤버 객체* )

중첩 클래스

반복자 타입
( 설명 전용 멤버 클래스 템플릿* )
adjacent_transform_view 가 common_range 가 아닐 때 사용되는 센티널 타입
( 설명 전용 멤버 클래스 템플릿* )

참고 사항

views :: adjacent_transform 는 N 이 0 인 경우에도 순방향 범위만을 허용합니다.

기능 테스트 매크로 값 표준 기능
__cpp_lib_ranges_zip 202110L (C++23) ranges:: zip_view ,
ranges:: zip_transform_view ,
ranges:: adjacent_view ,
ranges::adjacent_transform_view

예제

#include <array>
#include <iostream>
#include <ranges>
int main()
{
    constexpr static std::array data{1, 2, 3, 4, 5, 6};
    constexpr int window{3};
    auto Fun = [](auto... ints) { return (... + ints); };
    // 또는, Fun은 임의의 삼항(window == 3인 경우) 호출 가능 객체일 수 있습니다. 예를 들어:
    // auto Fun = [](int x, int y, int z) { return x + y + z; };
    constexpr auto view = data | std::views::adjacent_transform<window>(Fun);
    static_assert(
        view.size() == (data.size() - window + 1)
        && std::array{6, 9, 12, 15}
        == std::array{view[0], view[1], view[2], view[3]}
        && view[0] == Fun(data[0], data[1], data[2])
        && view[1] == Fun(data[1], data[2], data[3])
        && view[2] == Fun(data[2], data[3], data[4])
        && view[3] == Fun(data[3], data[4], data[5])
    );
    for (int x : view)
        std::cout << x << ' ';
    std::cout << '\n';
}

출력:

6 9 12 15

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 4098 C++23 views :: adjacent_transform < 0 > 가 입력 전용 범위를 허용했음 거부되도록 변경됨

참고문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 26.7.27 인접 변환 뷰 [range.adjacent.transform]

참고 항목

적응된 뷰의 인접한 요소들에 대한 참조 튜플로 구성된 view
(클래스 템플릿) (범위 어댑터 객체)
각 요소에 변환 함수를 적용하는 시퀀스의 view
(클래스 템플릿) (범위 어댑터 객체)
적응된 뷰들의 대응하는 요소들에 변환 함수를 적용한 결과로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
요소들의 범위에 함수를 적용함
(알고리즘 함수 객체)