c++ - 容器类型的 View

标签 c++ c++20

根据 http://eel.is/c++draft/range.view#concept:view , rangeview 仅当该范围允许恒定时间移动构建、移动赋值和销毁时才满足。

但是,我想知道如何将 container 项(例如 std::map)转换为 viewable_range。底层红黑树的时间复杂度对于典型操作是 O(log n) 而不是 O(1)。

理论位于:http://eel.is/c++draft/range.refinements#concept:viewable_range声明 viewable_range 概念指定了可以安全转换为 View 的范围类型的要求。 [“安全地”这个词有点难以理解]

换句话说,我想知道为什么这样的代码编译没有错误,其中 table_entries 被认为是 viewable_range 但理论上它不应该是因为时间复杂度不是 O(1)。

#include <map>
#include <algorithm>
#include <ranges>

auto main() -> int {

    std::map<int, int> table_entries;
    auto vals = std::ranges::min(table_entries | std::views::values);

    return 0;
}

最佳答案

混淆似乎是由这个 line 引起的:

The view concept specifies the requirements of a range type that has constant time move construction, move assignment, and destruction; ...

这并不意味着构建 View 的基础范围需要支持常量时间操作。只有 View 本身需要支持常量时间操作。


请注意,容器 table_entries 本身不是 view(出于您提到的原因)。但是,table_entries | std::views::values 一个 View ,因为它懒惰地按需生成 map 中的每个值。

这是另一个例子:

table_entries;                  // not a view
std::views::all(table_entries); // is a view

关于c++ - 容器类型的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64492425/

相关文章:

c++ - 当元素的成员为 const 时,在编译时初始化 std::array。自定义 to_array 实现

C++ 从文件 I/O 解析数据

c# - OpenCV 程序不能在另一台计算机上运行

c++ - C++20 中模板的参数依赖查找

c++ - 为什么没有引入std::ranges::?

c++ - 为什么 Ranges 库中的 std::views::take_while 需要 const 谓词?

c++ - 如何通过 .pro 文件 (Qt) 将命令传递给链接描述文件

c++ - 如何将索引变量用于递归函数?

c++ - 模板模板参数,内部参数不固定

c++ - 为什么 C++ 20 中没有枚举概念?