【问题标题】:Standard input to C++20 range adaptors w/o temporary variables无临时变量的 C++20 范围适配器的标准输入
【发布时间】:2021-04-19 04:13:09
【问题描述】:

我可以从标准输入读取ints,将它们转换为odd或even,将结果写入标准输出:

std::vector<int> v;
std::ranges::copy(
    std::istream_iterator<int>(std::cin),
    std::istream_iterator<int>(),
    std::back_inserter(v)
    );
std::ranges::copy(
    v | std::views::transform([](int a_int){return a_int%2 ? "odd":"even";}),
    std::ostream_iterator<std::string>(std::cout, " ")
    );

可以在没有临时变量的情况下完成:

std::transform(
    std::istream_iterator<int>(std::cin),
    std::istream_iterator<int>(),
    std::ostream_iterator<std::string>(std::cout, " "),
        [](int a_int){return a_int%2 ? "odd":"even";});

如何使用 C++20 范围适配器来执行此操作而无需临时设置?

有点像:

std::istream_iterator<int>(std::cin)
    | std::transform([](int a_int){return a_int%2 ? "odd":"even";})
    | std::ostream_iterator<std::string>(std::cout, " ");

【问题讨论】:

  • 显然有一个istream_view。
  • @HTNW 不幸的是,它是红色的,尚未在 cppreference.com 上记录

标签: c++ functional-programming c++20


【解决方案1】:

您始终可以使用std::ranges::subrange 将基于迭代器的算法转换为基于视图的算法:

std::ranges::copy(
    std::ranges::subrange(std::istream_iterator<int>(std::cin), std::istream_iterator<int>())
    | std::views::transform([](int a_int){return a_int%2 ? "odd":"even";}),
    std::ostream_iterator<const char*>(std::cout, " ")
);

虽然在这种情况下有一个专门的std::ranges::istream_view&lt;T&gt;,它基本上相当于子范围:

std::ranges::copy(
    std::ranges::istream_view<int>(std::cin)
    | std::views::transform([](int a_int){return a_int%2 ? "odd":"even";}),
    std::ostream_iterator<const char*>(std::cout, " ")
);

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2020-09-04
    • 2020-10-08
    • 2012-04-15
    • 2021-06-21
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多