代码之家  ›  专栏  ›  技术社区  ›  Rakete1111

什么时候在迭代器上使用协程?

  •  5
  • Rakete1111  · 技术社区  · 6 年前

    假设我有我想要提供的数据“一次一个”。有很多数据,这就是为什么我只有在需要的时候才能得到一块(以节省内存)。所以我不能将整个数据存储在 std::vector .

    今天我可以使用迭代器来实现这一点,因为它们很自然地适合这个需求。但我也可以使用协程(目前使用的是协程TS)。不需要使用只使用迭代器的算法。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nicol Bolas    6 年前

    迭代器充当一种粘合剂,允许用户编写在值序列上操作的算法,而不知道该序列是如何到达那里或是如何保持的。但是算法和序列之间的具体“粘合”是无关的。关键在于算法的具体实现必须根据特定类型的“粘合”来实现。

    标准库迭代器模型很有用,因为标准库附带了使用此模型的工具(算法、容器的迭代器构造函数、基于范围的 for 等)。如果你没有真正使用这些机制…然后,与任何其他模型相比,使用迭代器模型没有任何目标可以实现。你可以有一个物体 get_next 函数与A has_next 或者类似的接口。它们几乎都是同样有效的,从一个转换到另一个并不困难。

    协程仅在这方面有用,因为它简化了 实施 操作。使用generation coroutine的代码将具有与以前基本相同的接口;它只是在内部使用 co_yield 以及一个暂停和恢复的堆栈帧。

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

    推荐文章