Namespaces
Variants

std::ranges::views::split, std::ranges::split_view

Depuis fr.cppreference.net
 
 
Bibliothèque des ranges
Adaptateurs de ranges
 
 
Défini dans l'en-tête <ranges>
template< ranges::forward_range V, ranges::forward_range Pattern >
requires ranges::view<V> &&
         ranges::view<Pattern> &&
         std::indirectly_comparable<ranges::iterator_t<V>,
                                    ranges::iterator_t<Pattern>,
                                    ranges::equal_to>
class split_view
    : public ranges::view_interface<split_view<V, Pattern>>
(1) (depuis C++20)
namespace views {
    inline constexpr /* unspecified */ split = /* unspecified */;
}
(2) (depuis C++20)
Signature d'appel
template< ranges::viewable_range R, class Pattern >
    requires /* see below */
constexpr ranges::view auto split( R&& r, Pattern&& pattern );
(depuis C++20)
template< class Pattern >
constexpr /* range adaptor closure */ split( Pattern&& pattern );
(depuis C++20)
1) split_view prend une vue et un délimiteur, et divise la vue en sous-ranges sur le délimiteur.
2) RangeAdaptorObject. L'expression views::split(e, p) est équivalente à une expression à split_view(e, p) pour toutes sous-expressions appropriées e et p.

split_view modélise les concepts forward_range, et common_range lorsque la vue V sous-jacente modélise les concepts respectifs.

La range interne (ranges::range_reference_t<split_view>) est une ranges::subrange<ranges::iterator_t<V>>, qui modélise common_range, modélise sized_range lorsque ranges::iterator_t<V> modélise std::sized_sentinel_for<ranges::iterator_t<V>>, et modélise contiguous_range, random_access_range, bidirectional_range, et forward_range lorsque V modélise les concepts respectifs.

Contrairement à lazy_split_view, split_view maintient la continuité de la sous-range, ce qui le rend approprié pour la division de chaînes.

Membres de données

Membre Description
V base_ (privé) la vue sous-jacente (adaptée) view
( objet membre d'exposition uniquement* )
Pattern pattern_ (privé) l'objet motif utilisé comme délimiteur pour diviser la view sous-jacente
( objet membre d'exposition uniquement* )
non-propagating-cache < ranges:: subrange
< ranges:: iterator_t < V >>>
cached_begin_ (privé)
un objet qui met en cache le résultat du premier appel à begin()
( objet membre d'exposition uniquement* )

Fonctions membres

construit un split_view
(fonction membre publique)
retourne une copie de la vue sous-jacente (adaptée)
(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)
recherche la prochaine occurrence du motif
( fonction membre d'exposition uniquement* )
Hérité de ranges::view_interface
indique si la vue dérivée est vide, fournie uniquement si elle satisfait à sized_range ou forward_range
(fonction membre publique de std::ranges::view_interface<D>)
(C++23)
renvoie un itérateur constant au début de la plage
(fonction membre publique de std::ranges::view_interface<D>)
(C++23)
renvoie un sentinelle pour l'itérateur constant de la plage
(fonction membre publique de std::ranges::view_interface<D>)
indique si la vue dérivée n'est pas vide, fournie uniquement si ranges::empty lui est applicable
(fonction membre publique de std::ranges::view_interface<D>)
renvoie le premier élément dans la vue dérivée, fourni si elle satisfait à forward_range
(fonction membre publique de std::ranges::view_interface<D>)

Classes imbriquées

le type d'itérateur
( classe membre d'exposition uniquement* )
le type de sentinelle
( classe membre d'exposition uniquement* )

Guides de déduction

Notes

Avant P2210R2 , split_view utilisait un mécanisme lazy pour le fractionnement, et ne pouvait donc pas conserver les propriétés bidirectionnelles, d'accès aléatoire ou contiguës de la vue sous-jacente, ni rendre le type d'itérateur de la plage interne identique à celui de la vue sous-jacente. Par conséquent, il a été repensé par P2210R2 , et le mécanisme lazy a été déplacé vers lazy_split_view .

Le délimiteur pattern ne devrait généralement pas être un littéral de chaîne ordinaire, car il considérera le terminateur nul comme une partie nécessaire du délimiteur ; par conséquent, il est conseillé d'utiliser un littéral std::string_view à la place.

Exemple

#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>
int main()
{
    using std::operator""sv;
    constexpr auto words{"Hello^_^C++^_^20^_^!"sv};
    constexpr auto delim{"^_^"sv};
    for (const auto word : std::views::split(words, delim))
        // avec le constructeur de plage C++23 de string_view :
        std::cout << std::quoted(std::string_view(word)) << ' ';
    std::cout << '\n';
}

Sortie :

"Hello" "C++" "20" "!"

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 Appliqué à Comportement publié Comportement corrigé
P2210R2 C++20 l'ancien split_view était trop paresseux pour être facilement utilisé il a été repensé

Voir aussi

une view sur les sous-intervalles obtenus en divisant une autre view en utilisant un délimiteur
(modèle de classe) (objet adaptateur de gamme)
une view constituée de la séquence obtenue en aplatissant une view de range s
(modèle de classe) (objet adaptateur de gamme)