C++ 什么是istream_视图?何时使用?

C++ 什么是istream_视图?何时使用?,c++,range,c++20,istream,istream-view,C++,Range,C++20,Istream,Istream View,显然,C++20有一个新的std::istream相关构造:std::istream\u视图。当前为存根†。那么,“查看istream”是什么?我可以使用它做什么 †-好的,从技术上讲,它重定向到一个关于std::basic_istream_视图的页面,该页面是存根。一个std::istream_视图是一个范围;更具体地说,形成为视图的范围。标准库中添加的内容类似于您在std::ranges::views下找到的内容,只是它不是任意范围的视图,而是std::istream的视图 那么什么“查看

显然,C++20有一个新的
std::istream
相关构造:
std::istream\u视图
。当前为存根†。那么,“查看
istream
”是什么?我可以使用它做什么



†-好的,从技术上讲,它重定向到一个关于
std::basic_istream_视图
的页面,该页面是存根。

一个
std::istream_视图
是一个范围;更具体地说,形成为视图的范围。标准库中添加的内容类似于您在
std::ranges::views
下找到的内容,只是它不是任意范围的视图,而是
std::istream
的视图

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

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

另一个采用了
std::istream\u视图的功能:

  • @Barry将其描述为从istream解析
    T
    s的协同程序的等价物;请阅读以了解详细信息(请注意,这是关于ranges-v3中的istream视图,其中大部分已成为标准ranges库)
  • @Nicolas认为这是“在C++20视图界面中包装
    std::istream_迭代器
    ”的结果

所以它只是一个包装在C++20视图界面中的
istream\u迭代器。@Nicolas:它真的只是一对
std::istream\u迭代器(my\u istream)
std::istream\u迭代器()
?我怀疑它是否使用了这些类型,因为我不确定它们是否算作概念化迭代器。但你所描述的是基本思想。@Barry:我错误地认为切换元素类型使其成为非视图。已编辑。@是否通过
获取迭代器?为什么?我发现大部分(如果不是全部的话)人都在复制迭代器。调用一个
all\u of
,如果您有N^2份副本,它会执行一些
查找。您没有使用
?所有这些东西都复制了迭代器。