- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有想要“一次一个”提供的数据。有很多数据,这就是为什么我只在需要时才得到一份(以节省内存)。所以我不能将整个数据存储在 std::vector
中。
今天我可以为此使用迭代器,因为它们自然地满足了这个要求。但我也可以使用协同程序(目前使用的是 Coroutines TS)。不需要使用仅使用迭代器的算法。
在这种情况下使用协程比使用迭代器有什么优势吗?
最佳答案
迭代器充当一种胶水,允许用户编写对值序列进行运算的算法,而无需知道该序列是如何到达那里或如何保存的。但是算法和序列之间的特定“胶水”是无关紧要的。唯一重要的是算法的特定实现必须根据特定类型的“胶水”来实现。
标准库迭代器模型很有用,因为标准库附带了使用该模型的工具(算法、容器的迭代器构造函数、基于范围的 for
等)。如果您实际上没有使用这些机制……那么与任何其他模型相比,使用迭代器模型不会获得任何目标。您可以只拥有一个具有 get_next
函数和 has_next
或一些类似接口(interface)的对象。它们的效率大致相同,并且不难从一种转换为另一种。
协程在这方面只有在简化操作的实现的程度上才有用。使用生成协程的代码将具有与以前基本相同的接口(interface);它只是在内部使用 co_yield
和一个暂停和恢复的堆栈框架。
因为协程的栈帧是一个持续存在的对象,所以你不需要显式地创建生成对象。生成值的函数可以使用堆栈变量作为其状态,然后根据需要从该堆栈数据中获取 co_yield
值。这将允许您构建一个通用的生成器框架,许多不同的函数都可以使用,从而在所有生成器的通用接口(interface)和执行生成的特定代码之间创建一些分离。
关于c++ - 什么时候使用协程而不是迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54275767/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!