Dans range-v3, création d'un pipeline qui transforme des éléments d'une plage potentiellement infinie à l'aide d'une fonction tierce qui renvoie un vecteur peut être difficile en raison de l'incapacité de créer des vues de conteneurs temporaires.
Considérez le code suivant :
auto rng = src | view::transform(f) | view::join;
où src est une plage infinie de type T et f est une fonction tierce qui renvoie un std::vector
Des mises à jour récentes de range-v3 ont introduit une solution à ce problème : l'opérateur views::cache1. Cet opérateur crée un conteneur temporaire qui stocke la sortie d'une transformation, permettant à d'autres vues du pipeline d'accéder à ses éléments.
Pour implémenter correctement le pipeline souhaité, ajoutez vues::cache1 avant vues::join:
auto rng = src | view::transform(f) | views::cache1 | views::join;
L'exemple de code suivant démontre l'utilisation de vues::cache1 dans la pratique :
<code class="cpp">auto rng = views::iota(0, 4) | views::transform([](int i) { return std::string(i, char('a' + i)); }) | views::cache1 | views::join('-'); check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'});</code>
C'est important à noter que la plage transformée rng ne conserve pas toutes les propriétés de plage de sa plage source. Dans l'exemple ci-dessus, il perd le concept de portée avant en raison de la création de conteneurs temporaires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!