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) |
|
|
(C++26)
|
결과
approximately_sized_range
의 대략적인 크기를 반환합니다
(public member function) |
ranges::view_interface | |
| empty파생된 뷰가 비어 있는지 반환하며, 이는 sized_range 또는 forward_range std::ranges::view_interface<D>를 만족하는 경우에만 제공됩니다.(
| |
cbegin |
(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
(클래스 템플릿) (커스터마이제이션 포인트 객체) |
|
|
(C++20)
|
요소들의 범위에 함수를 적용함
(알고리즘 함수 객체) |