何时使用协程而不是迭代器?

7
假设我有一些数据,我想“逐个提供”这些数据。由于数据量很大,所以只有在需要时才会提供一条数据(以节省内存)。因此,我不能将整个数据存储在 std::vector 中。
如今,我可以使用迭代器来实现此功能,因为它们自然适合这种要求。但是,我也可以使用协程(目前使用 Coroutines TS)。在这种情况下,使用仅使用迭代器的算法并不是必需的。
在这种情况下,使用协程是否比使用迭代器有任何优势?

我猜你是在指流迭代器?否则,范围必须已经存储在某个地方。 - Fureeish
@Fureeish 有效地,是的 :) - Rakete1111
我认为协程是一种迭代器,它会在每次迭代之间存储一定量的信息(协程的堆栈),并且每次迭代都涉及依赖于这些存储信息的计算。因此,如果您不必在每次迭代之间存储可变数量的信息来计算迭代,或者用于计算下一个迭代的算法不变,则协程可能不比持有某些状态的迭代器更好的选择。 - Oliv
@ Rakete1111:“使用只使用迭代器的算法是不必要的。”那么你一开始为什么还要使用迭代器呢? - Nicol Bolas
@NicolBolas即使我没有使用任何<algorithm>,拥有一个可以解引用和增加以获取数据的“it”迭代器仍然是有用的。我也可以使用getCurrent()consume()函数。 - Rakete1111
显示剩余2条评论
1个回答

4
迭代器作为一种“胶水”,允许用户编写操作值序列的算法,而不必知道该序列如何到达或被保留。但是算法和序列之间的具体“胶水”是无关紧要的。它只在于特定算法的实现必须基于特定类型的“胶水”。
标准库迭代器模型很有用,因为标准库提供了使用这个模型的工具(算法、容器的迭代器构造函数、基于范围的for循环等)。如果你实际上没有使用这些机制……那么与任何其他模型相比,使用迭代器模型并没有什么好处。你可以只有一个具有get_next函数和has_next函数或某些类似接口的对象。它们都大致同样有效,并且从一个转换到另一个并不难。
协程只有在简化操作的实现时才有用。使用生成协程的代码基本上具有与以前相同的接口;它只是内部使用co_yield和暂停/恢复的堆栈帧。
由于协程的堆栈帧是一个持久存在的对象,因此您不需要显式创建生成对象。生成值的函数可以使用堆栈变量来保存其状态,然后根据需要从该堆栈数据中co_yield值。这将允许您构建一个通用生成器框架,许多不同的函数可以使用它,从而在所有生成器的一般接口和执行生成的特定代码之间创建一些分离。

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