使用 Range-V3 的临时容器的范围管道
问题:
您有一个元素范围 (src) 和第三方函数 (f),该函数将范围中的元素作为输入并返回向量。您想要使用 f 转换范围中的每个元素并将结果向量展平为单个范围。但是,直接使用 view::transform 和 view::join 是行不通的,因为无法为临时容器创建视图。
解决方案:
支持这样的管道,range-v3 引入了views::cache1 运算符。该运算符允许您将视图的结果存储在临时容器中,然后创建该容器的视图。通过在管道中包含views::cache1,您可以创建展平向量的视图:
auto rng = src | views::transform(f) | views::cache1 | views::join;
代码示例:
以下代码示例演示了如何使用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>
以上是如何使用 Range-V3 管道展平从函数返回的向量?的详细内容。更多信息请关注PHP中文网其他相关文章!