Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich einen unendlichen Bereich mit einer Funktion transformieren, die temporäre Container in Bereich-v3 zurückgibt?

Wie kann ich einen unendlichen Bereich mit einer Funktion transformieren, die temporäre Container in Bereich-v3 zurückgibt?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 04:42:03394Durchsuche

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

Pipelining von Range-v3-Transformationen mit temporären Containern

In Range-v3 wird eine Pipeline erstellt, die Elemente eines potenziell unendlichen Bereichs mithilfe einer zurückgegebenen Drittanbieterfunktion transformiert Ein Vektor kann eine Herausforderung darstellen, da keine Ansichten temporärer Container erstellt werden können.

Problem: Transformieren eines Bereichs mit einer Funktion, die temporäre Vektoren zurückgibt

Beachten Sie den folgenden Code:

auto rng = src | view::transform(f) | view::join;

wobei src ein unendlicher Bereich vom Typ T ist und f eine Funktion eines Drittanbieters ist, die einen std::vector zurückgibt. Die Ausführung dieses Codes würde zu einem Kompilierungsfehler führen, da view::transform eine Ansicht eines temporären Containers erstellt, der von f zurückgegeben wird.

Lösung: Einführung des Cache1-Operators

Kürzlich wurden Updates für range-v3 eingeführt Eine Lösung für dieses Problem: der Views::cache1-Operator. Dieser Operator erstellt einen temporären Container, der die Ausgabe einer Transformation speichert und anderen Ansichten in der Pipeline den Zugriff auf ihre Elemente ermöglicht.

Um die gewünschte Pipeline korrekt zu implementieren, fügen Sie „views::cache1“ vor „views::join:

auto rng = src | view::transform(f) | views::cache1 | views::join;
Codebeispiel

Das folgende Codebeispiel demonstriert die Verwendung von view::cache1 in der Praxis:

<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>
Bereichseigenschaften

Es ist wichtig Beachten Sie, dass der transformierte Bereich rng nicht alle Bereichseigenschaften seines Quellbereichs beibehält. Im obigen Beispiel geht das Forward-Range-Konzept aufgrund der Erstellung temporärer Container verloren.

Das obige ist der detaillierte Inhalt vonWie kann ich einen unendlichen Bereich mit einer Funktion transformieren, die temporäre Container in Bereich-v3 zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn