std::ranges::views::lazy_split, std::ranges::lazy_split_view
| Défini dans l'en-tête <ranges>
|
||
template< ranges::input_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> &&
(ranges::forward_range<V> || /*tiny-range*/<Pattern>)
class lazy_split_view
: public ranges::view_interface<lazy_split_view<V, Pattern>>
|
(1) | (depuis C++20) |
namespace views {
inline constexpr /* unspecified */ lazy_split = /* unspecified */;
}
|
(2) | (depuis C++20) |
| Signature d'appel |
||
template< ranges::viewable_range R, class Pattern >
requires /* see below */
constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
|
(depuis C++20) | |
template< class Pattern >
constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern );
|
(depuis C++20) | |
| Concepts d'aide |
||
template< class R >
concept /*tiny-range*/ =
ranges::sized_range<R> &&
requires { /* is-statically-constexpr-sized */<R>; } &&
(std::remove_reference_t<R>::size() <= 1);
|
(3) | (exposition uniquement*) |
lazy_split_view prend une vue et un délimiteur, et divise la vue en sous-plages selon le délimiteur.
Deux scénarios principaux sont pris en charge :
- La vue est un input_range, le délimiteur est un élément unique (enveloppé dans un
single_view). - La vue est un forward_range, le délimiteur est une vue d'éléments.
views::lazy_split(e, f) est équivalente à une expression à lazy_split_view(e, f)./*tiny-range*/<Pattern> est satisfait si Pattern satisfait sized_range, Pattern::size() est une expression constante et convient comme argument non-type de modèle, et la valeur de Pattern::size() est inférieure ou égale à 1. Notamment, empty_view et single_view satisfont ce concept.lazy_split_view modélise les concepts forward_range et input_range lorsque la vue V sous-jacente modélise les concepts respectifs, et modélise common_range lorsque V modélise à la fois forward_range et common_range.
La plage interne (ranges::range_reference_t<lazy_split_view>) modélise les concepts forward_range et input_range lorsque la vue V sous-jacente modélise les concepts respectifs. Elle ne modélise pas common_range et ne peut pas être utilisée avec des algorithmes qui attendent un bidirectional_range ou supérieur.
Contrairement à split_view, lazy_split_view ne maintient pas la continuité de la sous-plage.
Membres de données
| Membre | Description |
V
base_
(privé)
|
la vue sous-jacente
view
( objet membre d'exposition uniquement* ) |
Pattern
pattern_
(privé)
|
le motif utilisé comme délimiteur pour diviser la
view
sous-jacente
( objet membre d'exposition uniquement* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(privé)
(présent uniquement si
V
ne satisfait pas
forward_range
)
|
un objet qui met en cache le résultat des appels à
begin()
( objet membre d'exposition uniquement* ) |
Fonctions membres
construit un
lazy_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) |
|
Hérité de ranges::view_interface | |
| retourne si la vue dérivée est vide, fourni uniquement si elle satisfait 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, fourni uniquement si ranges::empty lui est applicable (fonction membre publique de std::ranges::view_interface<D>)
| |
| retourne 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 de modèle à usage d'exposition uniquement* ) |
|
|
le type d'itérateur de la plage interne
( classe membre de modèle à usage d'exposition uniquement* ) |
Guides de déduction
Notes
Le nom
lazy_split_view
est introduit par le rapport de défaut post-C++20
P2210R2
. Il possède le même mécanisme de paresse que l'ancien
split_view
avant la modification.
Exemple
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> auto print = [](auto const& view) { // `view` est de type std::views::lazy_split_view::__outer_iterator::value_type for (std::cout << "{ "; const auto element : view) std::cout << element << ' '; std::cout << "} "; }; int main() { constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9}; constexpr int delimiter{0}; constexpr std::ranges::lazy_split_view outer_view{source, delimiter}; std::cout << "splits[" << std::ranges::distance(outer_view) << "]: "; for (auto const& inner_view: outer_view) print(inner_view); constexpr std::string_view hello{"Hello C++ 20 !"}; std::cout << "\n" "substrings: "; std::ranges::for_each(hello | std::views::lazy_split(' '), print); constexpr std::string_view text{"Hello-+-C++-+-20-+-!"}; constexpr std::string_view delim{"-+-"}; std::cout << "\n" "substrings: "; std::ranges::for_each(text | std::views::lazy_split(delim), print); }
Sortie :
splits[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
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é |
|---|---|---|---|
| P2210R2 | C++20 |
l'ancien
split_view
était trop paresseux pour être facilement utilisé
|
déplace ses fonctionnalités vers
lazy_split_view
|
Voir aussi
|
(C++20)
|
une
view
sur les sous-intervalles obtenus en divisant une autre
view
en utilisant un délimiteur
(modèle de classe) (objet adaptateur de plage) |
|
(C++20)
|
une
view
constituée de la séquence obtenue en aplatissant une
view
de
range
s
(modèle de classe) (objet adaptateur de plage) |