Namespaces
Variants

std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
Definido en el encabezado <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) (desde C++23)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ adjacent = /* unspecified */ ;
}
(2) (desde C++23)
namespace views {
    inline constexpr auto pairwise = adjacent<2>;
}
(3) (desde C++23)
Signatura de llamada
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto adjacent<N>( R&& r );
(desde C++23)
1) adjacent_view es un adaptador de rango que toma una vista, y produce una vista cuyo i-ésimo elemento (una “ventana”) es un std::tuple que contiene N referencias a los elementos [i, i + N - 1] de la vista original.
Sea S el tamaño de la vista original. Entonces el tamaño de la vista producida es:
  • S - N + 1, si S >= N,
  • 0 en caso contrario, y la vista resultante está vacía.
2) El nombre views::adjacent<N> denota un RangeAdaptorObject. Dada una subexpresión e y una expresión constante N, la expresión views::adjacent<N>(e) es equivalente en expresión a
  • ((void)e, auto(views::empty<tuple<>>)) si N es igual a 0 y decltype((e)) models forward_range,
  • adjacent_view<views::all_t<decltype((e))>, N>(e) en caso contrario.
3) El nombre views::pairwise denota un RangeAdaptorObject que se comporta exactamente como views::adjacent<2>.

adjacent_view siempre models forward_range, y models bidirectional_range, random_access_range, o sized_range si el tipo de vista adaptado models el concepto correspondiente.

Miembros de datos

Miembro Descripción
V base_ la view subyacente
( miembro objeto solo para exposición* )

Funciones miembro

construye un adjacent_view
(función miembro pública)
devuelve un iterador al inicio
(función miembro pública)
devuelve un iterador o centinela al final
(función miembro pública)
devuelve el número de elementos, proporcionado solo si el rango subyacente (adaptado) satisface sized_range
(función miembro pública)
devuelve el tamaño aproximado del approximately_sized_range resultante
(función miembro pública)
Heredado de ranges::view_interface
devuelve si la vista derivada está vacía, siempre que satisfaga sized_range o forward_range
(función miembro pública de std::ranges::view_interface<D>)
(C++23)
devuelve un iterador constante al inicio del rango
(función miembro pública de std::ranges::view_interface<D>)
(C++23)
devuelve un centinela para el iterador constante del rango
(función miembro pública de std::ranges::view_interface<D>)
devuelve si la vista derivada no está vacía, siempre que ranges::empty sea aplicable a ella
(función miembro pública de std::ranges::view_interface<D>)
devuelve el primer elemento en la vista derivada, siempre que satisfaga forward_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el último elemento en la vista derivada, siempre que satisfaga bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el nésimo elemento en la vista derivada, siempre que satisfaga random_access_range
(función miembro pública de std::ranges::view_interface<D>)

Guías de deducción

(ninguno)

Clases anidadas

el tipo de iterador
( clase de miembro plantilla solo para exposición* )
el tipo de centinela utilizado cuando adjacent_view no es un common_range
( clase de miembro plantilla solo para exposición* )

Plantillas auxiliares

template < class V, size_t N >

constexpr bool ranges:: enable_borrowed_range < adjacent_view < V, N >> =

ranges:: enable_borrowed_range < V > ;
(desde C++23)

Esta especialización de ranges::enable_borrowed_range hace que adjacent_view satisfaga borrowed_range cuando la vista subyacente lo satisface.

Notas

views :: adjacent solo acepta rangos forward incluso cuando N es 0 .

Existen similitudes entre ranges::adjacent_view y ranges::slide_view :

  • Ambos crean una "ventana deslizante" de tamaño N .
  • Ambos tienen el mismo tamaño S - N + 1 , donde S es el tamaño de una view adaptada tal que S >= N > 0 .

La siguiente tabla muestra las diferencias entre estos adaptadores:

Adaptador de vista value_type El tamaño de ventana N
ranges :: adjacent_view std::tuple Un parámetro de plantilla
ranges:: slide_view ranges:: range Un argumento en tiempo de ejecución
Macro de prueba de características Valor Std Característica
__cpp_lib_ranges_zip 202110L (C++23) ranges:: zip_view ,
ranges:: zip_transform_view ,
ranges::adjacent_view ,
ranges:: adjacent_transform_view

Ejemplo

#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);
    }
}

Salida:

v = [1 2 3 4 5 6]
e = [1 2 3]
e =   [2 3 4]
e =     [3 4 5]
e =       [4 5 6]

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 4098 C++23 views :: adjacent < 0 > aceptaba rangos de solo entrada se rechaza

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 26.7.25 Vista adyacente [range.adjacent]

Véase también

una view que consiste en los resultados de la aplicación de una función de transformación a elementos adyacentes de la vista adaptada
(plantilla de clase) (objeto adaptador de rango)
una view cuyo M-ésimo elemento es una view sobre los elementos M-ésimo hasta (M + N - 1)-ésimo de otra view
(plantilla de clase) (objeto adaptador de rango)
un rango de view s que son fragmentos sucesivos no superpuestos de tamaño N de los elementos de otra view
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en elementos de otra view , avanzando N elementos a la vez
(plantilla de clase) (objeto adaptador de rango)