【发布时间】:2011-10-24 01:06:21
【问题描述】:
我正在寻找满足以下条件的数据结构(或数据结构的组合)的 C++ 实现:
- 访问项目的方式与在 std::vector 中的方式相同
- 提供随机访问迭代器(连同迭代器比较)
- 平均项目 访问(:lookup) 时间最多为
O(log(n))复杂度 - 项目的迭代顺序与添加到容器中的顺序相同
- 给定一个迭代器,我可以找出容器中指向的项目的序数位置,最坏的情况是
O(log(n))复杂度 - 在最坏的
O(log(n))复杂度在特定位置提供项目插入和删除 - 移除/插入项目不会使之前获得的迭代器失效
提前感谢您的任何建议
达利博尔
(编辑)答案:
我选择的答案描述了满足所有这些要求的数据结构。然而,正如 Maxim Yegorushkin 所建议的, boost::multi_index 提供的功能与上述功能非常接近。
(编辑)某些要求未正确指定。根据更正(:original)
进行修改(编辑)我找到了接受的答案中描述的数据结构的实现。到目前为止,它按预期工作。它叫counter tree
(编辑)考虑使用 sp2danny 建议的 AVL-Array
【问题讨论】:
-
您不能拥有多行 cmets。最好编辑问题。
-
也许是一个 boost.multi_index 和一个底层向量加上一个用于快速查找的集合类型索引...
-
在标准库中没有这样的容器可以满足您的所有要求。另外,即使理论上我也不相信存在这样的容器。您应该优先考虑您的要求,以便我们可以想到最合适的东西
-
您的要求列表排除了使用任何已知的 single 数据结构。你会遇到所有这些的唯一方法是使用组合多个数据结构的东西(例如Kerrek提到的
boost::multi_index) -
如果有这样的容器,那将是标准库中唯一的一个。
标签: c++ data-structures iterator complexity-theory