什么时候使用协程而不是迭代器?

When to use coroutines over iterators?

假设我有要提供的数据 'one at a time'。有很多数据,这就是为什么我只在需要时才得到一份(以节省内存)。所以我不能将整个数据存储在 std::vector.

今天我可以为此使用迭代器,因为它们自然符合这个要求。但我也可以使用协同程序(目前使用的是 Coroutines TS)。不需要使用仅使用迭代器的算法。

在这种情况下使用协程比使用迭代器有什么优势吗?

迭代器充当一种胶水,允许用户编写对值序列进行运算的算法,而无需知道该序列是如何到达那里或被保存的。但是算法和序列之间的具体"glue"是无关紧要的。唯一重要的是算法的特定实现必须根据特定类型的 "glue".

来实现

标准库迭代器模型很有用,因为标准库附带使用此模型的工具(算法、容器的迭代器构造函数、基于范围的 for 等)。如果您实际上没有使用这些机制......那么与任何其他模型相比,使用迭代器模型不会获得任何 objective 。您可以只拥有一个具有 get_next 函数和 has_next 或一些类似接口的对象。它们的效率大致相同,并且不难从一种转换为另一种。

协程仅在简化操作的实现 的程度上才有用。使用生成协程的代码将具有与以前基本相同的接口;它只是在内部使用 co_yield 和一个暂停和恢复的堆栈框架。

因为协程的栈帧是一个持续存在的对象,所以你不需要显式地创建生成对象。生成值的函数可以使用堆栈变量作为其状态,然后根据需要从该堆栈数据中获取 co_yield 值。这将允许您构建一个通用的生成器框架,许多不同的函数可以使用,从而在所有生成器的通用接口和执行生成的特定代码之间创建一些分离。