std::ranges::views::counted
| 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
Tmodélise input_or_output_iterator etdecltype((count))modélisestd::convertible_to<D>,- si
Tmodélise contiguous_iterator, alorsviews::counted(it, count)est équivalent à l'expression àstd::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))), - sinon, si
Tmodélise random_access_iterator, alorsviews::counted(it, count)est équivalent à l'expression àranges::subrange(it, it + static_cast<D>(count)), - sinon,
views::counted(it, count)est équivalent à l'expression àranges::subrange(std::counted_iterator(it, count), std::default_sentinel).
- si
- 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
(C++20) |
une vue consistant en les N premiers éléments d'une autre vue (modèle de classe) (objet adaptateur de range) |
(C++20) |
combine une paire itérateur-sentinelle en une vue (modèle de classe) |
(C++20) |
adaptateur d'itérateur qui suit la distance jusqu'à la fin du range (modèle de classe) |
(C++20)(C++20) |
retourne le nombre d'éléments satisfaisant des critères spécifiques (objet fonction d'algorithme) |