plage-à-accès-aléatoire-dimensionnée
Depuis fr.cppreference.net
template< class T >
concept /*sized-random-access-range*/ =
ranges::random_access_range<T> &&
ranges::sized_range<T>;
|
(depuis C++26) (exposé uniquement*) |
|
Le concept exposé uniquement sized-random-access-range spécifie les exigences d'un type plage qui connaît sa taille en temps constant et permet un accès aléatoire à ses éléments.
Notes
sized-random-access-range est utilisé par les algorithmes de plage parallèles pour rejeter un argument de plage non bornée. Les raisons en sont :
- Pour une implémentation parallèle efficace, les limites de l'espace d'itération doivent être connues. Sinon, il est difficile d'appliquer la stratégie « diviser pour régner » pour créer du travail pour plusieurs threads d'exécution.
- Bien que les algorithmes de plage séquentiels permettent de passer une plage « infinie » comme
std::ranges::views::iota(0), cela peut entraîner une boucle sans fin. Il est difficile d'imaginer l'utilité de cela dans le cas d'une exécution parallèle. Exiger que les séquences de données soient bornées permet potentiellement d'éviter des erreurs à l'exécution. - L'utilisation de plages de sortie explicitement bornées suit les pratiques établies de codage sécurisé, qui recommandent ou même exigent de toujours spécifier la taille de la sortie afin d'éviter des modifications de données hors limites.
- Si plusieurs plages ou séquences d'entrée sont bornées, un algorithme devrait généralement s'arrêter dès que la fin est atteinte pour la plus courte. Il existe déjà des précédents dans la norme où un algorithme prend deux séquences avec des tailles d'entrée potentiellement différentes et choisit la taille la plus petite comme nombre d'itérations qu'il va effectuer, comme std::ranges::transform et std::ranges::mismatch.
- Comme les séquences de données de sortie sont bornées, on ne suppose plus qu'elles ont un espace suffisant pour toutes les entrées. Il est donc possible que certains éléments des séquences d'entrée ne soient pas traités par un algorithme, et il est logique que celui-ci retourne des itérateurs vers les positions dans ces séquences où le traitement s'est arrêté.