std ::地图没有父母指针

std::map without parent pointers?

本文关键字:父母 指针 地图 std      更新时间:2023-10-16

libstdc ,例如,使用红色黑色二进制树在节点中使用父母指针实现std ::映射。这意味着迭代器可以是节点的指针。

标准库可以在节点中存储父母指针的情况下实现std ::映射吗?我认为这意味着迭代器需要包含一堆父母指针,因此需要动态分配对数的内存。这会违反迭代器的标准性能限制吗?父母指示不会在其余的界面上违反任何其他性能吗?

C 17中的新节点内容/接口呢?

他们可能不这样做。std::map保证从其中删除键值对不会使任何迭代器无效。

如果迭代器将存储一堆父母,并删除了父母,这也将使这些迭代器无效。保证将不再保证。

有可能吗?可能:-)是个好主意吗?几乎肯定不是。大多数是可能的,如果您对它们投入更多存储或速度: - (

以仅仅删除父指针,您可以,例如,在地图中维护一个单调值,每次更改地图结构时都会增加。从本质上讲,它是地图结构的版本标识符。因此,在地图中添加或删除元素会增加此值,而仅更改地图中的数据并不是。

然后将包含:

  • 指向地图本身的指针(获取当前版本(;
  • 一堆指针;和
  • 上次创建堆栈时匹配的版本。

这个想法基本上是在使用迭代器进行任何操作之前,请检测地图版本何时与迭代器不同,如果是迭代器,请重建堆栈并更新迭代器版本,然后再继续使用任何操作'重新尝试执行。

现在,虽然这使得无需父母指针就可以迭代,但不幸的是,它违反了迭代器的其他一些要求,例如能够在不变的时间内采取行动。任何必须根据地图中数据重建数据结构的任何内容都会违反该限制。

无论如何,当他们的正确思想中的任何人都不会在实施的情况下当拥有父母指针时,这是一个可怕的方案,但是这里的目的只是表明它是可能。

因此,我的建议就是坚持父母指示。这种父母指针的使用使查找下一个/上一个元素的过程是一个相当简单的元素,基于 iTerator中的当前项目。