Maison  >  Article  >  développement back-end  >  Comment puis-je transformer une plage infinie avec une fonction renvoyant des conteneurs temporaires dans range-v3 ?

Comment puis-je transformer une plage infinie avec une fonction renvoyant des conteneurs temporaires dans range-v3 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 04:42:03394parcourir

How can I transform an infinite range with a function returning temporary containers in range-v3?

Transformations Pipelining Range-v3 avec des conteneurs temporaires

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.

Problème : Transformation d'une plage avec une fonction renvoyant des vecteurs 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. L'exécution de ce code entraînerait une erreur de compilation car view::transform crée une vue d'un conteneur temporaire renvoyé par f.

Solution : présentation de l'opérateur Cache1

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;

Exemple de code

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>

Propriétés de plage

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn