From cppreference.com
Defined in header
template<ranges::forward_rangeV,std::size_tN>requiresranges::view<V>&&(N>0)classadjacent_view:publicranges::view_interface<adjacent_view<V,N>> (1) (since C++23)namespaceviews{template<std::size_tN>constexpr/* unspecified */adjacent=/* unspecified */;} (2) (since C++23)namespaceviews{inlineconstexprautopairwise=adjacent<2>;} (3) (since C++23)Call signature
template<ranges::viewable_rangeR>requires/* see below */constexprranges::viewautoadjacent<N>(R&&r);(since C++23)1)adjacent_view is a range adaptor that takes a
, and produces a
whose ith element (a “window”) is a
that holds N references to the elements [i, i + N - 1] of the original view.
Let 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.
2) The name views::adjacent<N> denotes a
. Given a subexpression e and a constant expression N, the expression views::adjacent<N>(e) is
to
((void)e,auto(views::empty<tuple<>>)) if N is equal to 0 and decltype((e)) models
,
adjacent_view<views::all_t<decltype((e))>,N>(e) otherwise.
3) The name views::pairwise denotes a
that behaves exactly as views::adjacent<2>.
adjacent_view always models
, and models
,
, or
if adapted
type models the corresponding concept.
Data members
Member Description Vbase_the underlying
(exposition-only member object*)Member functions
constructs a adjacent_view
(public member function)
returns a copy of the underlying (adapted) 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
(public member function)
(C++26)
returns the approximate size of the resulting
(public member function)
Inherited from
returns whether the derived view is empty, provided only if it satisfies
or
(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 only if
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
(public member function of std::ranges::view_interface<D>)
returns the last element in the derived view, provided only if it satisfies
and
(public member function of std::ranges::view_interface<D>)
returns the nth element in the derived view, provided only if it satisfies
(public member function of std::ranges::view_interface<D>)
Deduction guides
(none)
Nested classes
the iterator type
(exposition-only member class template*)the sentinel type used when adjacent_view is not a
(exposition-only member class template*)Helper templates
template<classV,size_tN>constexprboolranges::enable_borrowed_range<adjacent_view<V,N>>=ranges::enable_borrowed_range<V>;(since C++23)This specialization of
makes adjacent_view satisfy
when the underlying view satisfies it.
Notes
views::adjacent only accepts forward ranges even when N is 0.
There are similarities between ranges::adjacent_view and ranges::slide_view:
Both create “sliding window” of size N.
Both have the same size S - N + 1, where S is the size of an adapted
such that S >= N > 0.
The following table shows the differences between these adaptors:
View adaptorvalue_typeThe window size Nranges::adjacent_view
A template parameter ranges::slide_viewranges::rangeA runtime argument
macroValueStdFeature
(C++23)ranges::zip_view,
ranges::zip_transform_view,
ranges::adjacent_view,
ranges::adjacent_transform_viewExample
Run this code
#include<print>#include<ranges>#include<tuple>intmain(){staticconstexprautov={1,2,3,4,5,6};std::println("v = {}",v);for(inti{};std::tuplet:v|std::views::adjacent<3>){constauto[t0,t1,t2]=t;std::println("e = {:<{}}[{}, {}, {}]","",3*i++,t0,t1,t2);}}Output:
v = [1, 2, 3, 4, 5, 6] e = [1, 2, 3] e = [2, 3, 4] e = [3, 4, 5] e = [4, 5, 6] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++23 adjacent_view does not provide a base() accessor added
C++23 views::adjacent<0> used to accept input-only ranges made rejected References
C++23 standard (ISO/IEC 14882:2024):
26.7.25 Adjacent view [range.adjacent]
See also