在最近介绍的 C++20 Ranges 中,我知道views
通过使用视图适配器来实现可组合性。我也知道视图不拥有它们的元素并且它们的本质是惰性的,也就是说它们只在需要时才进行实际计算。
视图如何实现O(1)
移动、复制和分配操作的复杂性?对我来说可能的答案是,视图只是对“待计算”操作的描述,它们只是指数据及其转换。
不过,这听起来像是视图只是承担了表达我们编码序列的工作,并且只有在传递给一些急切的事物(例如算法)时,它们才会在这个特定的单个调用中显示所有计算负载。
后续问题:我可以理解如何实现O(1)
复制,本质上是指可复制对象(尽管我不知道这是否是什么ranges::views
)。但我无法理解这将如何在分配操作中发挥作用。同样,一个可能的答案是,因为所有这些都发生在编译时,所以再次只是“描述”分配是一个O(1)
操作。但是改变std::vector<int>
视图所看到的,是一个运行时操作(很好的例子)。这还是O(1)
手术吗?