【问题标题】:What is an istream_view and when do I use one?什么是 istream_view,何时使用?
【发布时间】:2021-03-23 08:26:25
【问题描述】:

显然,C++20 有一个新的std::istream 相关结构:std::istream_viewcppreference page on it 现在是一个存根。那么,什么是“istream 的视图”,我可以用它做什么?


†​​ - 好的,从技术上讲,它会重定向到一个关于 std::basic_istream_view 的页面,那个是一个存根。

【问题讨论】:

    标签: c++ range c++20 istream istream-view


    【解决方案1】:

    std::istream_view<T> 是一个范围;更具体地说,形成为视图的范围。标准库的这一新增内容类似于您在 std::ranges::views 下可能找到的内容 - 除了它不是任意范围的视图,而是 std::istream 的视图。

    那么什么“查看”应用于std::istream?回想一下 istreamcharacters 的流,而不是您选择的任意 T 类型的元素。将这些字符解析为连续的T 的惰性应用是 istream 的“查看”。也就是说,std::istream_view<T>(is) 的第 k 个元素是 t 类型为 T 的第 k 次运行 is >> t 的元素。

    当您想将适用于范围的代码直接应用于输入数据时,您可以使用std::istream_view (carefully),而不是首先将您的输入解析为更“老派”的某些数据结构" 方式,然后将该结构作为一个范围处理。

    其他人了解std::istream_view 是什么:

    • @Barry 描述为相当于从 istream 解析 Ts 的协程;阅读this answer 了解详情(注意它是关于ranges-v3 中的istream 视图,其中大部分已成为标准范围库)。
    • @NicolBolas 认为这是“在 C++20 视图界面中包装 std::istream_iterator<T>”的结果。

    【讨论】:

    • 所以它只是一个包裹在 C++20 视图界面中的istream_iterator<T>
    • @NicolBolas:真的只有std::istream_iterator<T>(my_istream)std::istream_iterator<T>()这对吗?
    • 我怀疑它使用的正是这些类型,因为我不确定它们是否算作概念化迭代器。但你描述的是基本思想。
    • @Barry:我错误地认为切换元素类型使其成为非视图。已编辑。
    • @AsteroidsWithWings 所以你把你的迭代器带到&?为什么?我发现大多数(如果不是全部)人到处复制迭代器。调用 all_of 执行一些 find_ifing 并且您有 N^2 份副本。你不使用<algorithm>?所有这些东西都复制了迭代器。
    猜你喜欢
    • 2021-09-18
    • 2021-03-26
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2011-04-07
    • 2011-12-27
    相关资源
    最近更新 更多