std::ranges:: views:: adjacent_transform, std::ranges:: adjacent_transform_view, std::ranges:: views:: pairwise_transform
| 
           Defined in header
            
            
             <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) | (since C++23) | 
| 
           
            
             namespace
            
            views
            
             {
            
             
             
              template
             
             
              <
             
             
              
               std::
               
                size_t
               
              
             
             N
             
              >
             
              | (2) | (since C++23) | 
| 
           
            
             namespace
            
            views
            
             {
            
             
             
              inline
             
             
              constexpr
             
             
              auto
             
             pairwise_transform
             
              =
             
             adjacent_transform
             
              <
             
             
              2
             
             
              >
             
             
              ;
             
              | (3) | (since C++23) | 
| 
           Call signature
           | ||
| 
           
            
             template
            
            
             <
            
            
             
              ranges::
              
               viewable_range
              
             
            
            R,
            
             class
            
            F
            
             >
            
             
             requires
             
              /* see below */
             
              | (since C++23) | |
| 
           
            
             template
            
            
             <
            
            
             class
            
            F
            
             >
            
             constexpr /*range adaptor closure*/ adjacent_transform < N > ( F && fun ) ; | (since C++23) | |
        adjacent_transform_view
       
       is a range adaptor that takes a
       
        
         view
        
       
       and an invocable object
       
        
         fun
        
       
       , and produces a
       
        
         view
        
       
       whose
       
        
         i
        
       
       
        th
       
       element is a value that is the result of applying
       
        
         fun
        
       
       to each element in
       
        
         [
        
        
         
          i
         
        
        
         ,
        
        
         
          i
          
           +
          
          N
         
        
        
         )
        
       
       of the original view.
       
        F
       
       always has
       
        arity
       
       
        N
       
       .
      
        
         S
        
       
       be the size of the original view. Then the size of produced view is:
       - S - N + 1 , if S >= N ,
-  0  otherwise, and the resulting view is empty.
        N
       
       , the expression
       
        
         views
         
          ::
         
         
          adjacent_transform
         
         
          <
         
         N
         
          >
         
         
          (
         
         e, f
         
          )
         
        
       
       is
       
        expression-equivalent
       
       to:
       - 
         
          
           
            (
           
           
            (
           
           
            void
           
           
            )
           
           e,
           
            
             views::
             
              zip_transform
             
            
           
           
            (
           
           f
           
            )
           
           
            )
           
          
         
         , if
         Nis equal to  0  and decltype ( ( e ) ) modelsforward_range(except that the evaluations of e and f are indeterminately sequenced ),
- adjacent_transform_view < views:: all_t < decltype ( ( e ) ) > , std:: decay_t < decltype ( ( f ) ) > , N > ( e, f ) otherwise.
        F
       
       is also
       
        
         
          2
         
        
       
       and
       
        
         fun
        
       
       is a binary invocable object.
      
       
        adjacent_transform_view
       
       always models
       
        
         forward_range
        
       
       , and models
       
        
         bidirectional_range
        
       
       ,
       
        
         random_access_range
        
       
       , or
       
        
         sized_range
        
       
       , if adapted
       
        
         view
        
       
       type models the corresponding concept.
      
Member functions
| constructs a 
          adjacent_transform_view
         (public member function) | |
| returns an iterator to the beginning (public member function) | |
| returns an iterator or a sentinel to the end (public member function) | |
| returns the number of elements. Provided only if the underlying (adapted) range satisfies 
           sized_range
          .(public member function) | |
| Inherited from std::ranges::view_interface | |
| returns whether the derived view is empty. Provided if it satisfies 
           sized_range
          or
           forward_range
          .(public member function of 
           std::ranges::view_interface<D>
          ) | |
| 
           
            
             
              (C++23)
             
            
           
           | returns a constant iterator to the beginning of the range. (public member function of 
           std::ranges::view_interface<D>
          ) | 
| 
           
            
             
              (C++23)
             
            
           
           | returns a sentinel for the constant iterator of the range. (public member function of 
           std::ranges::view_interface<D>
          ) | 
| returns whether the derived view is not empty. Provided if
         
          
           ranges::empty
          
         
         is applicable to it. (public member function of 
           std::ranges::view_interface<D>
          ) | |
| returns the first element in the derived view. Provided if it satisfies 
           forward_range
          .(public member function of 
           std::ranges::view_interface<D>
          ) | |
| returns the last element in the derived view. Provided if it satisfies 
           bidirectional_range
          and
           common_range
          .(public member function of 
           std::ranges::view_interface<D>
          ) | |
| returns the 
          n
         th
         
         element in the derived view. Provided if it satisfies
           random_access_range
          .(public member function of 
           std::ranges::view_interface<D>
          ) | |
Deduction guides
(none)
Member types
| Member type | Definition | 
| 
          
           InnerView
          
         (private) | ranges::
             
              adjacent_view
             
            
           
           
            <
           
           V, N
           
            >
           
          
         
         . ( exposition-only member type* ) | 
| 
          
           inner_iterator
          
         (private) | 
 | 
| 
          
           inner_sentinel
          
         (private) | 
 | 
Data members
| Member name | Definition | 
| 
          
           fun_
          
         (private) | /*movable-box*/
           
           
            <
           
           F
           
            > ( exposition-only member object* ) | 
| 
          
           inner_
          
         (private) | ranges::
             
              adjacent_view
             
            
           
           
            <
           
           V,N
           
            > ( exposition-only member object* ) | 
Nested classes
| the iterator type ( exposition-only member class template* ) | |
| the sentinel type used when 
          adjacent_transform_view
         is not a
           common_range
          ( exposition-only member class template* ) | 
Notes
       
        
         views
         
          ::
         
         
          adjacent_transform
         
        
       
       only accepts foward ranges even when
       
        N
       
       is
       
        0
       
       .
      
| Feature-test macro | Value | Std | Feature | 
|---|---|---|---|
| 
           __cpp_lib_ranges_zip
           | 202110L | (C++23) | ranges::
            
             zip_view
            
           
          
         
         , ranges:: zip_transform_view , ranges:: adjacent_view , 
          ranges::adjacent_transform_view
          | 
Example
#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); }; // Alternatively, the Fun could be any ternary (if window == 3) callable, e.g.: // 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'; }
Output:
6 9 12 15
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior | 
|---|---|---|---|
| LWG 4098 | C++23 | views :: adjacent_transform < 0 > used to accept input-only ranges | made rejected | 
References
- C++23 standard (ISO/IEC 14882:2024):
- 
         - 26.7.27 Adjacent transform view [range.adjacent.transform]
 
See also
| a 
           view
          consisting of tuples of references to adjacent elements of the adapted view(class template) (range adaptor object) | |
| a 
           view
          of a sequence that applies a transformation function to each element(class template) (range adaptor object) | |
| a 
           view
          consisting of results of application of a transformation function to corresponding elements of the adapted views(class template) (customization point object) | |
| 
           
            
             
              (C++20)
             
            
           
           | applies a function to a range of elements (algorithm function object) |