std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise - cppreference.com

From cppreference.com

Defined in header

<ranges>

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

view

, and produces a

view

whose ith element (a “window”) is a

std::tuple

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

RangeAdaptorObject

. Given a subexpression e and a constant expression N, the expression views::adjacent<N>(e) is

expression-equivalent

to

((void)e,auto(views::empty<tuple<>>)) if N is equal to 0 and decltype((e)) models

forward_range

,

adjacent_view<views::all_t<decltype((e))>,N>(e) otherwise.

3) The name views::pairwise denotes a

RangeAdaptorObject

that behaves exactly as views::adjacent<2>.

adjacent_view always models

forward_range

, and models

bidirectional_range

,

random_access_range

, or

sized_range

if adapted

view

type models the corresponding concept.

Data members

Member Description Vbase_the underlying

view

(exposition-only member object*)Member functions

(constructor)

constructs a adjacent_view
(public member function)

[edit]

base

returns a copy of the underlying (adapted) view
(public member function)

[edit]

begin

returns an iterator to the beginning
(public member function)

[edit]

end

returns an iterator or a sentinel to the end
(public member function)

[edit]

size

returns the number of elements, provided only if the underlying (adapted) range satisfies

sized_range

(public member function)

[edit]

reserve_hint

(C++26)

returns the approximate size of the resulting

approximately_sized_range

(public member function)

[edit]

Inherited from

std::ranges::view_interface

empty

returns whether the derived view is empty, provided only if it satisfies

sized_range

or

forward_range

(public member function of std::ranges::view_interface<D>)

[edit]

cbegin

(C++23)

returns a constant iterator to the beginning of the range
(public member function of std::ranges::view_interface<D>)

[edit]

cend

(C++23)

returns a sentinel for the constant iterator of the range
(public member function of std::ranges::view_interface<D>)

[edit]

operator bool

returns whether the derived view is not empty, provided only if

ranges::empty

is applicable to it
(public member function of std::ranges::view_interface<D>)

[edit]

front

returns the first element in the derived view, provided if it satisfies

forward_range

(public member function of std::ranges::view_interface<D>)

[edit]

back

returns the last element in the derived view, provided only if it satisfies

bidirectional_range

and

common_range

(public member function of std::ranges::view_interface<D>)

[edit]

operator[]

returns the nth element in the derived view, provided only if it satisfies

random_access_range

(public member function of std::ranges::view_interface<D>)

[edit]

Deduction guides

(none)

Nested classes

the iterator type
(exposition-only member class template*)the sentinel type used when adjacent_view is not a

common_range

(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

ranges::enable_borrowed_range

makes adjacent_view satisfy

borrowed_range

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

view

such that S >= N > 0.

The following table shows the differences between these adaptors:

View adaptorvalue_typeThe window size Nranges::adjacent_view

std::tuple

A template parameter ranges::slide_viewranges::rangeA runtime argument

Feature-test

macroValueStdFeature

__cpp_lib_ranges_zip

202110L

(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

LWG 3848

C++23 adjacent_view does not provide a base() accessor added

LWG 4098

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