Namespaces
Variants

std::ranges::views::counted

Depuis fr.cppreference.net
 
 
Bibliothèque de ranges
Adaptateurs de range
 
Défini dans l'en-tête <ranges>
inline constexpr /* unspecified */ counted = /* unspecified */;
(depuis C++20)
Signature d'appel
template< class Iterator, class DifferenceType >
    requires /* see below */
constexpr /*span-or-subrange*/ counted( Iterator&& it, DifferenceType&& count );
(depuis C++20)

Une vue comptée présente une vue des éléments du range compté [i, n) pour un itérateur i et un entier non négatif n.

Un range compté [i, n) est les n éléments commençant par l'élément pointé par i et jusqu'à, mais sans inclure, l'élément, s'il existe, pointé par le résultat de n applications de ++i.

Si n == 0, le range compté est valide et vide. Sinon, le range compté n'est valide que si n est positif, i est déréférençable, et [++i, --n) est un range compté valide.

Formellement, si it et count sont des expressions, T est std::decay_t<decltype((it))>, et D est std::iter_difference_t<T>, alors

si T modélise input_or_output_iterator et decltype((count)) modélise std::convertible_to<D>,
Sinon, views::counted(it, count) est mal formé.

Objets points de personnalisation

Le nom views::counted désigne un objet point de personnalisation, qui est un objet fonction const d'un type de classe semiregular littéral. Voir CustomizationPointObject pour plus de détails.

Notes

views::counted ne vérifie pas si le range est assez long pour fournir tous les count éléments : utilisez views::take si cette vérification est nécessaire.

Exemple

#include <iostream>
#include <ranges>

int main()
{
    const int a[]{1, 2, 3, 4, 5, 6, 7};
    for (int i : std::views::counted(a, 3))
        std::cout << i << ' ';
    std::cout << '\n';

    const auto il = {1, 2, 3, 4, 5};
    for (int i : std::views::counted(il.begin() + 1, 3))
        std::cout << i << ' ';
    std::cout << '\n';
}

Sortie :

1 2 3
2 3 4

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 tel que publié Comportement correct
P2393R1 C++20 la conversion implicite d'un type entier-classe vers std::size_t pourrait être invalide rendue explicite

Voir aussi

une vue consistant en les N premiers éléments d'une autre vue
(modèle de classe) (objet adaptateur de range)
combine une paire itérateur-sentinelle en une vue
(modèle de classe)
adaptateur d'itérateur qui suit la distance jusqu'à la fin du range
(modèle de classe)
retourne le nombre d'éléments satisfaisant des critères spécifiques
(objet fonction d'algorithme)