std::ranges...s::pairwise(3)
π std::ranges...s::pairwise(3) π
okay bestie, this page is from the C++ Standard Libary (yes, that spelling is literally right there), and it is lowkey giving βsliding windows but make it templates.β π
πΈ NAME πΈ
std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise
-
std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise
β¨ Synopsis β¨
Defined in header <ranges>.
template< ranges::forward_range V, std::size_t N >
requires ranges::view<V> && (N > 0)
class adjacent_view
: public ranges::view_interface<adjacent_view<V, N>>
(1) (since C++23)
namespace views {
template< std::size_t N >
inline constexpr /* unspecified */ adjacent = /* unspecified */ ;
}
(2) (since C++23)
namespace views {
inline constexpr auto pairwise = adjacent<2>;
}
(3) (since C++23)
π Call signature π
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto adjacent<N>( R&& r );
(since C++23)
1) adjacent_view is a range adaptor that takes a view, and produces a view whose i^th element (a βwindowβ) is a std::tuple that holds N references to the elements of the original view, from i^th up to i + N - 1^th inclusively.
Let S be the size of the original view. Then the size of produced view is:
S - N + 1, ifS >= N,0otherwise, 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<>>))ifNis equal to0,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.
π Member functions π
- constructor β constructs a
adjacent_view(C++23) (public member function) - begin β returns an iterator to the beginning (C++23) (public member function)
- end β returns an iterator or a sentinel to the end (C++23) (public member function)
- size β returns the number of elements. Provided only if the underlying (adapted) range satisfies
sized_range. (C++23) (public member function)
π«Ά Inherited from std::ranges::view_interface
- empty β returns whether the derived view is empty. Provided if it satisfies
sized_rangeorforward_range. (C++20) (public member function ofstd::ranges::view_interface<D>) - cbegin β returns a constant iterator to the beginning of the range. (C++23) (public member function of
std::ranges::view_interface<D>) - cend β returns a sentinel for the constant iterator of the range. (C++23) (public member function of
std::ranges::view_interface<D>) - operator bool β returns whether the derived view is not empty. Provided if
ranges::emptyis applicable to it. (C++20) (public member function ofstd::ranges::view_interface<D>) - front β returns the first element in the derived view. Provided if it satisfies
forward_range. (C++20) (public member function ofstd::ranges::view_interface<D>) - back β returns the last element in the derived view. Provided if it satisfies
bidirectional_rangeandcommon_range. (C++20) (public member function ofstd::ranges::view_interface<D>) - operator[] β returns the
n^th element in the derived view. Provided if it satisfiesrandom_access_range. (C++20) (public member function ofstd::ranges::view_interface<D>)
π Deduction guides π
(none)
π¦ Nested classes π¦
- iterator β the iterator type. (C++23)
(exposition-only member class template*) - sentinel β the sentinel type used when
adjacent_viewis not acommon_range. (C++23)(exposition-only member class template*)
π Helper templates π
template< class V, size_t N >
inline constexpr bool ranges::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 π
There are similarities between ranges::adjacent_view and ranges::slide_view:
- Both create a βsliding windowβ of size
N. - Both have the same size
S - N + 1, whereSis the size of an adapted view such thatS >= N > 0.
The differences between these adapters are:
- View adaptor:
ranges::adjacent_viewβ value_type: Astd::tupleobject β The window sizeN: A template parameter - View adaptor:
ranges::slide_viewβ value_type: A range β The window sizeN: A runtime parameter
Feature-test macro:
- Feature-test macro:
__cpp_lib_ranges_zipβ Value:202110Lβ Std:(C++23)β Feature:std::ranges::zip_view,std::ranges::zip_transform_view,std::ranges::adjacent_view,std::ranges::adjacent_transform_view
π Example π
// Run this code
#include <array>
#include <format>
#include <iostream>
#include <ranges>
#include <tuple>
int main()
{
constexpr std::array v{1, 2, 3, 4, 5, 6};
std::cout << "v = [1 2 3 4 5 6]\n";
for (int i{}; std::tuple t : v | std::views::adjacent<3>)
{
auto [t0, t1, t2] = t;
std::cout << std::format("e = {:<{}}[{} {} {}]\n", "", 2 * 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]
π References π
- C++23 standard (
ISO/IEC 14882:2023):26.7.25 Adjacent view [range.adjacent]
π See also π
ranges::adjacent_transform_view/views::adjacent_transformβ a view consisting of tuples of results of application of a transformation function to adjacent elements of the adapted view. (C++23) (class template) (range adaptor object)ranges::slide_view/views::slideβ a view whoseM^th element is a view over theM^th through(M + N - 1)^th elements of another view. (C++23) (class template) (range adaptor object)ranges::chunk_view/views::chunkβ a range of views that areN-sized non-overlapping successive chunks of the elements of another view. (C++23) (class template) (range adaptor object)ranges::stride_view/views::strideβ a view consisting of elements of another view, advancing overNelements at a time. (C++23) (class template) (range adaptor object)
okay that is the whole page, bestie! source: http://cppreference.com, version/date: 2024.06.10, page: std::ranges...s::pairwise(3). slay πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms