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