Namespaces
Variants

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

Depuis fr.cppreference.net
 
 
Bibliothèque de plages
Adaptateurs de plages
 
 
Défini dans l'en-tête <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) (depuis C++23)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ adjacent = /* unspecified */ ;
}
(2) (depuis C++23)
namespace views {
    inline constexpr auto pairwise = adjacent<2>;
}
(3) (depuis C++23)
Signature d'appel
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto adjacent<N>( R&& r );
(depuis C++23)
1) adjacent_view est un adaptateur de plage qui prend une vue et produit une vue dont le ii-ième élément (une « fenêtre ») est un std::tuple qui contient N références aux éléments [ii + N - 1] de la vue d'origine.
Soit S la taille de la vue d'origine. Alors la taille de la vue produite est :
  • S - N + 1, si S >= N,
  • 0 sinon, et la vue résultante est vide.
2) Le nom views::adjacent<N> désigne un RangeAdaptorObject. Étant donné une sous-expression e et une expression constante N, l'expression views::adjacent<N>(e) est équivalente à l'expression
  • ((void)e, auto(views::empty<tuple<>>)) si N est égal à 0 et decltype((e)) modélise forward_range,
  • adjacent_view<views::all_t<decltype((e))>, N>(e) sinon.
3) Le nom views::pairwise désigne un RangeAdaptorObject qui se comporte exactement comme views::adjacent<2>.

adjacent_view modélise toujours forward_range, et modélise bidirectional_range, random_access_range ou sized_range si le type de la vue adaptée modélise le concept correspondant.

Membres de données

Membre Description
V base_ la view sous-jacente
( objet membre d'exposition uniquement* )

Fonctions membres

construit un adjacent_view
(fonction membre publique)
retourne un itérateur vers le début
(fonction membre publique)
retourne un itérateur ou un sentinelle vers la fin
(fonction membre publique)
retourne le nombre d'éléments, fourni uniquement si la plage sous-jacente (adaptée) satisfait sized_range
(fonction membre publique)
retourne la taille approximative de la approximately_sized_range résultante
(fonction membre publique)
Hérité de ranges::view_interface
retourne si la vue dérivée est vide, à condition qu'elle satisfasse sized_range ou forward_range
(fonction membre publique de std::ranges::view_interface<D>)
(C++23)
retourne un itérateur constant vers le début de la plage
(fonction membre publique de std::ranges::view_interface<D>)
(C++23)
retourne un sentinelle pour l'itérateur constant de la plage
(fonction membre publique de std::ranges::view_interface<D>)
retourne si la vue dérivée n'est pas vide, à condition que ranges::empty lui soit applicable
(fonction membre publique de std::ranges::view_interface<D>)
retourne le premier élément de la vue dérivée, à condition qu'elle satisfasse forward_range
(fonction membre publique de std::ranges::view_interface<D>)
retourne le dernier élément de la vue dérivée, à condition qu'elle satisfasse bidirectional_range et common_range
(fonction membre publique de std::ranges::view_interface<D>)
retourne le nth élément dans la vue dérivée, à condition qu'elle satisfasse random_access_range
(fonction membre publique de std::ranges::view_interface<D>)

Guides de déduction

(aucun)

Classes imbriquées

le type d'itérateur
( classe membre template* à titre d'exposition uniquement )
le type sentinelle utilisé lorsque adjacent_view n'est pas un common_range
( classe membre template* à titre d'exposition uniquement )

Modèles d'assistance

template < class V, size_t N >

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

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

Cette spécialisation de ranges::enable_borrowed_range permet à adjacent_view de satisfaire borrowed_range lorsque la vue sous-jacente la satisfait.

Notes

views :: adjacent n'accepte que les plages avant même lorsque N est 0 .

Il existe des similitudes entre ranges::adjacent_view et ranges::slide_view :

  • Les deux créent une « fenêtre glissante » de taille N .
  • Les deux ont la même taille S - N + 1 , où S est la taille d'une view adaptée telle que S >= N > 0 .

Le tableau suivant montre les différences entre ces adaptateurs :

Adaptateur de vue value_type La taille de la fenêtre N
ranges :: adjacent_view std::tuple Un paramètre template
ranges:: slide_view ranges:: range Un argument d'exécution
Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_ranges_zip 202110L (C++23) ranges:: zip_view ,
ranges:: zip_transform_view ,
ranges::adjacent_view ,
ranges:: adjacent_transform_view

Exemple

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

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 4098 C++23 views :: adjacent < 0 > acceptait les plages en entrée seule rejeté

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 26.7.25 Vue adjacente [range.adjacent]

Voir aussi

une view constituée des résultats de l'application d'une fonction de transformation aux éléments adjacents de la vue adaptée
(modèle de classe) (objet adaptateur de gamme)
une view dont le M ème élément est une view sur les M ème à (M + N - 1) ème éléments d'une autre view
(modèle de classe) (objet adaptateur de gamme)
une gamme de view s qui sont des segments successifs non chevauchants de taille N des éléments d'une autre view
(modèle de classe) (objet adaptateur de gamme)
une view constituée d'éléments d'une autre view , avançant de N éléments à la fois
(modèle de classe) (objet adaptateur de gamme)