使用Range-V3 的臨時容器的範圍管道
問題:
問題:您有一個元素範圍(src) 和第三方函數(f),該函數將範圍中的元素作為輸入並傳迴向量。您想要使用 f 轉換範圍中的每個元素並將結果向量展平為單一範圍。但是,直接使用 view::transform 和 view::join 是行不通的,因為無法為臨時容器建立視圖。
解:auto rng = src | views::transform(f) | views::cache1 | views::join;
支援這樣的管道,range-v3 引入了views::cache1 運算子。此運算符可讓您將視圖的結果儲存在臨時容器中,然後建立該容器的視圖。透過在管道中包含views::cache1,您可以建立展平向量的視圖:
程式碼範例:<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>以下程式碼範例示範如何使用views::cache1建立一個範圍管道,用於轉換和展平範圍內的元素:
以上是如何使用 Range-V3 管道展平從函數傳回的向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!