什么是 istream_view?何时使用它?

5

显然,C++20 有一个新的与 std::istream 相关的构造: std::istream_view关于它的cppreference页面现在是个草稿。那么,“istream的视图”是什么,我可以用它来做什么?


† - 好吧,技术上它重定向到一个关于std::basic_istream_view的页面,而这个页面是个草稿。

1个回答

5
std::istream_view<T>是一个范围,更具体地说,是由一个视图形成的范围。这个标准库中的新增功能类似于你可能在std::ranges::views下找到的 - 不同之处在于它不是任意范围的视图,而是std::istream的视图。
那么要对std::istream进行什么样的“视图”处理呢?回想一下,istream是一个字符流,而不是您选择的任意T类型的元素流。将这些字符延迟解析为连续的T的应用就是对流的“视图”处理。也就是说,std::istream_view<T>(is)的第k个元素是您运行is >> t(其中tT类型)第k次得到的内容。
当您希望直接将处理范围的代码应用于输入数据时,可以使用std::istream_view (小心使用),而不是首先以更加“老派”的方式将输入解析为某个数据结构,然后将该结构作为范围进行处理。
其他人对std::istream_view的看法:
  • @Barry将其描述为从istream中解析出T形式的协程等效物; 有关详细信息,请阅读此答案(请注意,它是关于ranges-v3中的istream视图的,其中大部分成为了标准ranges库)。
  • @NicolBolas认为它是将std::istream_iterator<T>包装在C++20视图界面中的结果。

2
所以它只是一个包装在C++20视图接口中的istream_iterator<T> - Nicol Bolas
我怀疑它是否确切地使用了那些类型,因为我不确定它们是否被视为概念化的迭代器。但你所描述的是基本思想。 - Nicol Bolas
@Barry:我错误地认为切换元素类型会使其成为非视图。已编辑。 - einpoklum
1
@AsteroidsWithWings,你是通过&来获取迭代器的吗?为什么?我发现大多数(如果不是全部)人都在到处复制迭代器。调用一个执行一些find_if操作的all_of函数,就会产生N^2次复制。你不使用<algorithm>吗?所有这些东西都会复制迭代器。 - Fureeish
1
@AsteroidsWithWings 嗯...我正在提供有关迭代器可用性的通用观点...不将变量存储在迭代器内,显然比实际存储它更节省空间。 - Fureeish
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接