【发布时间】:2011-01-14 00:42:20
【问题描述】:
我有一组数据需要存储在有序映射中(即通过键有效地插入、删除和定位项目),但我还需要能够找到 nth 元素而不遍历整个地图(其中有时可能有数万个项目)。
我知道一种方法:使用红/黑树,但也要在每个节点的一条腿上保留子项的总数。它使插入和删除稍微慢了一点(因为您必须像这样做一样更新路径上每个节点上的计数),但是您可以找到任何 n的 nth 元素> 与找到钥匙的时间大致相同。
我想知道是否存在我可以使用的这种东西的现有 C++ 实现。如果没有我可以自己写,但我真的不想。
编辑:我对它的用例做了一些澄清。我有点误解了:在按键查找项目后,他们需要能够有效地找出找到的项目的索引,才能正确显示滚动条。
它是一个合法的需求,我上面描述的数据结构仍然适用,所以我仍在寻找答案。不过好像还没有人想出一个,我要自己开始编码了。
【问题讨论】:
-
听起来你选错了容器。地图按键索引,不是按任意“从一开始的位置”。
-
@Tomalak:听起来他们正在挑选合适的容器,但在 stdlib 或其他地方找不到他们的需求。
-
@FredNurk:我同意。但是,根据我的阅读,我相信他们的要求表明了“设计气味”。毕竟,他们还没有找到任何符合他们“要求”的东西是有充分理由的。
-
这是一个类似的问题。 stackoverflow.com/questions/2290429/rank-tree-in-c 所以我们知道怎么做(在 Cormen、Leiserson、Rivest 的“增强数据结构”一章中),但 C++ stl 树似乎不允许您向树节点添加字段。也许是 boost 的“侵入式”库?我从来没有用过。我想我最终也会自己写这棵树。
-
@Tomalak:所以需要标准库中不存在的东西是一种“设计味道”?
标签: c++ data-structures