std::ranges::subrange
Depuis fr.cppreference.net
| Défini dans l'en-tête <ranges>
|
||
template<
std::input_or_output_iterator I,
std::sentinel_for<I> S = I,
ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
ranges::subrange_kind::sized :
ranges::subrange_kind::unsized >
requires (K == ranges::subrange_kind::sized || !std::sized_sentinel_for<S, I>)
class subrange
: public ranges::view_interface<subrange<I, S, K>>
|
(1) | (depuis C++20) |
| Concepts d'aide |
||
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
/* see description */;
|
(2) | (exposition seulement*) |
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
|
(3) | (exposition seulement*) |
1) Le modèle de classe
subrange combine un itérateur et une sentinelle en une seulevue. Il modélise sized_range lorsque le dernier paramètre de modèle est subrange_kind::sized (ce qui se produit lorsque std::sized_sentinel_for<S, I> est satisfait ou que la taille est explicitement passée comme argument au constructeur).2) Détermine si
From est convertible en To sansconversions de qualification. Équivalent à :
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
std::is_pointer_v<From> && std::is_pointer_v<To> &&
!std::convertible_to<std::remove_pointer_t<From>(*)[],
std::remove_pointer_t<To>(*)[]>;
3) Détermine si
From est convertible en To sans conversion de dérivé vers base :
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
std::convertible_to<From, To> &&
!/*uses-nonqualification-pointer-conversion*/
<std::decay_t<From>, std::decay_t<To>>;
Membres de données
| Membre | Description |
constexpr bool StoreSize [statique]
|
K == ranges::subrange_kind::sized && !std::sized_sentinel_for<S, I>(constante membre statique à titre d'exposé uniquement*) |
I begin_
|
un itérateur vers le début de la sous-plage (objet membre à titre d'exposé uniquement*) |
S end_
|
un sentinelle indiquant la fin de la sous-plage (objet membre à titre d'exposé uniquement*) |
make-unsigned-like-t <std::iter_difference_t<I>> size_ (présent uniquement si StoreSize est true)
|
la taille de la sous-plage (objet membre à titre d'exposé uniquement*) |
Fonctions membres
crée un nouveau
subrange
(fonction membre publique) |
|
convertit le
subrange
en un type
pair-like
(fonction membre publique) |
|
Observateurs |
|
|
obtient l'itérateur
(fonction membre publique) |
|
|
obtient le sentinelle
(fonction membre publique) |
|
vérifie si le
subrange
est vide
(fonction membre publique) |
|
obtient la taille du
subrange
(fonction membre publique) |
|
Opérations sur les itérateurs |
|
|
avance l'itérateur d'une distance donnée
(fonction membre publique) |
|
obtient une copie du
subrange
avec son itérateur décrémenté d'une distance donnée
(fonction membre publique) |
|
obtient une copie du
subrange
avec son itérateur avancé d'une distance donnée
(fonction membre publique) |
|
Hérité de ranges::view_interface | |
(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, uniquement si ranges::empty lui est applicable (fonction membre publique de std::ranges::view_interface<D>)
| |
| obtient l'adresse des données de la vue dérivée, uniquement si le type de son itérateur satisfait contiguous_iterator (fonction membre publique de std::ranges::view_interface<D>)
| |
| retourne le premier élément dans la vue dérivée, uniquement si elle satisfait forward_range (fonction membre publique de std::ranges::view_interface<D>)
| |
| retourne le dernier élément dans la vue dérivée, uniquement si elle satisfait bidirectional_range et common_range (fonction membre publique de std::ranges::view_interface<D>)
| |
retourne le ni-ième élément dans la vue dérivée, uniquement si elle satisfait random_access_range (fonction membre publique de std::ranges::view_interface<D>)
| |
Guides de déduction
Fonctions non membres
|
(C++20)
|
obtient un itérateur ou un sentinelle d'un
std::ranges::subrange
(modèle de fonction) |
Types auxiliaires
|
(C++20)
|
spécifie si un
std::ranges::subrange
modélise
std::ranges::sized_range
(énumération) |
|
obtient la taille d'un
std::ranges::subrange
(spécialisation de modèle de classe) |
|
|
obtient le type de l'itérateur ou du sentinelle d'un
std::ranges::subrange
(spécialisation de modèle de classe) |
Modèles d'assistance
|
template
<
class
I,
class
S,
ranges::
subrange_kind
K
>
constexpr bool ranges:: enable_borrowed_range < ranges :: subrange < I, S, K >> = true ; |
(depuis C++20) | |
Cette spécialisation de
ranges::
enable_borrowed_range
permet à
subrange
de satisfaire
borrowed_range
.
Exemple
Exécuter ce code
#include <map> #include <print> #include <ranges> void make_uppercase(char& v) { v += 'A' - 'a'; } void uppercase_transform(std::multimap<int, char>& m, int k) { auto [first, last] = m.equal_range(k); for (auto& [_, v] : std::ranges::subrange(first, last)) make_uppercase(v); } int main() { std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}}; std::println("Before: {}", mm); uppercase_transform(mm, 4); std::println("After: {}", mm); }
Sortie :
Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After: {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}
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 | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 3470 | C++20 |
convertible-to-non-slicing
pourrait rejeter les conversions de qualification
|
les accepte toujours |
Voir aussi
|
(C++20)
|
classe modèle utilitaire pour définir une
view
, utilisant le
curiously recurring template pattern
(classe modèle) |
Liens externes
Lire/écrire toutes les valeurs d'une
std::multimap
avec une clé donnée en C++20
— SO
|