std::ranges:: views:: adjacent_transform, std::ranges:: adjacent_transform_view, std::ranges:: views:: pairwise_transform
|
헤더 파일에 정의됨
<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
>
&&
|
(1) | (C++23부터) |
|
namespace
views
{
template
<
std::
size_t
N
>
|
(2) | (C++23부터) |
|
namespace
views
{
inline
constexpr
auto
pairwise_transform
=
adjacent_transform
<
2
>
;
|
(3) | (C++23부터) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R,
class
F
>
requires
/* 아래 참조 */
|
(C++23부터) | |
|
template
<
class
F
>
constexpr /*레인지 어댑터 클로저*/ adjacent_transform < N > ( F && fun ) ; |
(C++23부터) | |
adjacent_transform_view
는
view
와 호출 가능 객체
fun
를 취하는 범위 어댑터로,
view
를 생성하며, 이
view
의
i
번째
요소는 원본 뷰의
[
i
,
i
+
N
)
범위의 각 요소에
fun
을 적용한 결과 값입니다.
F
는 항상
arity
N
을 가집니다.
S
라고 하면, 생성된 뷰의 크기는 다음과 같습니다:
- S - N + 1 , 만약 S >= N 인 경우,
- 0 그렇지 않은 경우, 결과 뷰는 비어 있습니다.
N
이 주어졌을 때, 표현식
views
::
adjacent_transform
<
N
>
(
e, f
)
는 다음 표현과
동등합니다
:
-
(
(
void
)
e,
views::
zip_transform
(
f
)
)
, 만약
N이 0 이고 decltype ( ( e ) ) 가forward_range를 모델링하는 경우 (단, e 와 f 의 평가는 비결정적 순서 로 이루어집니다), - adjacent_transform_view < views:: all_t < decltype ( ( e ) ) > , std:: decay_t < decltype ( ( f ) ) > , N > ( e, f ) 그 외의 경우.
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) |
|
|
(C++26)
|
결과
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
(클래스 템플릿) (커스터마이제이션 포인트 객체) |
|
|
(C++20)
|
요소들의 범위에 함수를 적용함
(알고리즘 함수 객체) |