首页  >  文章  >  后端开发  >  如何使用 Range-V3 管道展平从函数返回的向量?

如何使用 Range-V3 管道展平从函数返回的向量?

Patricia Arquette
Patricia Arquette原创
2024-11-01 06:28:30820浏览

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

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn