Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich von einer Funktion zurückgegebene Vektoren mithilfe von Range-V3-Pipelines reduzieren?

Wie kann ich von einer Funktion zurückgegebene Vektoren mithilfe von Range-V3-Pipelines reduzieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-01 06:28:30824Durchsuche

How Can I Flatten Vectors Returned from a Function Using Range-V3 Pipelines?

Range-Pipelining mit temporären Containern unter Verwendung von Range-V3

Problem:

Sie haben ein Bereich von Elementen (src) und eine Drittanbieterfunktion (f), die ein Element des Bereichs als Eingabe verwendet und einen Vektor zurückgibt. Sie möchten jedes Element im Bereich mit f transformieren und die resultierenden Vektoren in einen einzigen Bereich reduzieren. Die direkte Verwendung von view::transform und view::join funktioniert jedoch nicht, da keine Ansichten für temporäre Container erstellt werden können.

Lösung:

Zur Unterstützung solcher Pipelines , range-v3 führt den Views::cache1-Operator ein. Mit diesem Operator können Sie die Ergebnisse einer Ansicht in einem temporären Container speichern und dann eine Ansicht dieses Containers erstellen. Durch Einschließen von „views::cache1“ in die Pipeline können Sie eine Ansicht der abgeflachten Vektoren erstellen:

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

Codebeispiel:

Das folgende Codebeispiel zeigt, wie um „views::cache1“ zu verwenden, um eine Bereichspipeline zu erstellen, die Elemente aus einem Bereich transformiert und reduziert:

<code class="cpp">#include <range/v3/view.hpp>
#include <range/v3/algorithm.hpp>
#include <vector>

std::vector<std::string> f(int i) {
  return std::vector<std::string>(i, char('a' + i));
}

int main() {
  auto rng = views::iota(0, 4)
        | views::transform([](int i) { return f(i); })
        | views::cache1
        | views::join('-');
  
  check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'});
  
  CPP_assert(input_range<decltype(rng)>);
  CPP_assert(!range<const decltype(rng)>);
  CPP_assert(!forward_range<decltype(rng)>);
  CPP_assert(!common_range<decltype(rng)>);

  return 0;
}</code>

Das obige ist der detaillierte Inhalt vonWie kann ich von einer Funktion zurückgegebene Vektoren mithilfe von Range-V3-Pipelines reduzieren?. 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