adjacent_transform_view takes an invocable object and
a view and produces a view
whose Mth element is the result of applying the invocable object
to the Mth through (M+N−1)th elements
of the original view.
If the original view has fewer than N elements, the resulting view is empty.
If N is equal to 0,
views::adjacent_transform<N>(E, F) is expression-equivalent to
((void)E, views::zip_transform(F)),
except that the evaluations of E and F are
indeterminately sequenced.
Otherwise,
the expression views::adjacent_transform<N>(E, F) is
expression-equivalent to
adjacent_transform_view<views::all_t<decltype((E))>, decay_t<decltype((F))>, N>(E, F).
[Example 1: vector v ={1, 2, 3, 4};
for(auto i : v | views::adjacent_transform<2>(std::multiplies())){
cout << i <<' '; // prints 2 6 12} — end example]