【问题标题】:construct span from a map从地图构建跨度
【发布时间】:2020-04-04 11:30:04
【问题描述】:

我有一张地图,我希望返回一个跨度,如下所示

map<string, map<string, Struct>> map;
span<pair<string, map<string, Struct>>> s {map.begin(), map.end()};

编译失败,抱怨没有从 map::iterator 到 span 模板类型的已知转换。我不确定为什么会失败,因为据我所知,迭代器范围构造函数应该分解映射迭代器(成对>)然后“复制”它。我在这里错过了什么?

用clang8编译

【问题讨论】:

    标签: c++ llvm-clang c++20


    【解决方案1】:

    std::span 只能用于内存中连续且一致的元素的集合,std::map 不是。

    std::span

    类模板 span 描述了一个可以引用 具有序列的第一个元素的连续对象序列 在零位置。

    一个典型的实现只包含两个成员:一个指向 T 的指针和一个 大小。

    【讨论】:

    • 我明白了,我假设迭代器对只会遍历范围并将每个地址存储在跨度中
    • @Madden:那个指针数组的内存从哪里来? span 不分配内存;这是一种视图类型。
    【解决方案2】:

    C++20 提供范围,可用于地图。

    但是,您可能需要重新考虑您实际这样做的原因。 std::span 的要点是为原始内存块提供 C++ 容器接口。地图已经提供了 C++ 容器接口。

    【讨论】:

    • 这里的重点是std::span用于连续元素,而std::map是基于节点的容器。
    • @JohnDing 这正是 std::range 可以工作的原因,因为它们不需要连续的内存块。
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    相关资源
    最近更新 更多