Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
adjacent_transform_view views::adjacent_transform
(C++23) (C++23)
views::pairwise_transform
(C++23)

헤더 파일에 정의됨 <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 /* 지정되지 않음 */ adjacent_transform = /* 지정되지 않음 */ ;

}
(2) (C++23부터)
namespace views {

inline constexpr auto pairwise_transform = adjacent_transform < 2 > ;

}
(3) (C++23부터)
호출 시그니처
template < ranges:: viewable_range R, class F >

requires /* 아래 참조 */

constexpr ranges:: view auto adjacent_transform < N > ( R && r, F && fun ) ;
(C++23부터)
template < class F >
constexpr /*레인지 어댑터 클로저*/ adjacent_transform < N > ( F && fun ) ;
(C++23부터)
1) adjacent_transform_view view 와 호출 가능 객체 fun 를 취하는 범위 어댑터로, view 를 생성하며, 이 view i 번째 요소는 원본 뷰의 [ i , i + N ) 범위의 각 요소에 fun 을 적용한 결과 값입니다. 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 ) 는 다음 표현과 동등합니다 :
3) 이름 views :: pairwise_transform RangeAdaptorObject 로서 정확히 views :: adjacent_transform < 2 > 와 동일하게 동작합니다. 특히, F 의 인자 개수(arity) 또한 2 이며 fun 은 이항 호출 가능 객체(binary invocable object)입니다.

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)
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)
파생 뷰의 첫 번째 요소를 반환합니다. 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)

중첩 타입

유형 정의
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
(클래스 템플릿) (커스터마이제이션 포인트 객체)
요소들의 범위에 함수를 적용함
(알고리즘 함수 객체)