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!