std ::地图没有父母指针
std::map without parent pointers?
libstdc ,例如,使用红色黑色二进制树在节点中使用父母指针实现std ::映射。这意味着迭代器可以是节点的指针。
标准库可以在节点中存储父母指针的情况下实现std ::映射吗?我认为这意味着迭代器需要包含一堆父母指针,因此需要动态分配对数的内存。这会违反迭代器的标准性能限制吗?父母指示不会在其余的界面上违反任何其他性能吗?
C 17中的新节点内容/接口呢?
他们可能不这样做。std::map
保证从其中删除键值对不会使任何迭代器无效。
如果迭代器将存储一堆父母,并删除了父母,这也将使这些迭代器无效。保证将不再保证。
有可能吗?可能:-)是个好主意吗?几乎肯定不是。大多数是可能的,如果您对它们投入更多存储或速度: - (
以仅仅删除父指针,您可以,例如,在地图中维护一个单调值,每次更改地图结构时都会增加。从本质上讲,它是地图结构的版本标识符。因此,在地图中添加或删除元素会增加此值,而仅更改地图中的数据并不是。
。然后将包含:
- 指向地图本身的指针(获取当前版本(;
- 一堆指针;和
- 上次创建堆栈时匹配的版本。
这个想法基本上是在使用迭代器进行任何操作之前,请检测地图版本何时与迭代器不同,如果是迭代器,请重建堆栈并更新迭代器版本,然后再继续使用任何操作'重新尝试执行。
现在,虽然这使得无需父母指针就可以迭代,但不幸的是,它违反了迭代器的其他一些要求,例如能够在不变的时间内采取行动。任何必须根据地图中数据重建数据结构的任何内容都会违反该限制。
无论如何,当他们的正确思想中的任何人都不会在实施的情况下当拥有父母指针时,这是一个可怕的方案,但是这里的目的只是表明它是可能。
因此,我的建议就是坚持父母指示。这种父母指针的使用使查找下一个/上一个元素的过程是一个相当简单的元素,基于仅 iTerator中的当前项目。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- std ::地图没有父母指针
- 有什么方法可以将指针指向孩子范围内的父母(派生)班级
- 如何从C 中的不同结构中声明父母指针