【发布时间】:2018-08-25 09:42:24
【问题描述】:
我一直在研究 C++ STL,但我不确定哪种数据结构最适合这个特定的用例。它需要能够在恒定时间内完成以下三件事:
- 按索引的恒定时间随机访问(因此可以在恒定时间内选择随机元素)
- 仅在最后的恒定时间推送/弹出
- 推送/弹出时指向包含项目的指针不能无效(不关心迭代器)
最初,我尝试使用矢量;它完全满足前两个标准。然而,我学到了一个艰难的方法,当你将新项目推送到向量上时,指向其元素的指针将变得无效,因为向量会重新定位自身以保持其所有内存连续。虽然问题可以通过提前使用向量的reserve() 方法来解决,但问题是它需要知道我可能需要在其中存储的最大元素数量,而这不是我提前知道的值时间,我也无法真正计算出来。我也不能在大小变大时再次使用reserve,因为指向向量元素的指针仍然会失效。
然后我尝试了一个双端队列。信不信由你,一个双端队列实际上完美地满足了所有三个标准。指向元素的指针不会因推送/弹出而失效,这是恒定的时间。但是,我注意到这是有代价的。双端队列比向量慢大约两倍。我知道双端队列具有能够将项目放在前面的附加功能,这对我的目的来说是不必要的,我不确定是不是特别是这种附加功能,或者不是所有的内存都是保持连续,这是造成放缓的原因。
虽然双端队列确实满足这三个条件,但 C++ STL 中是否有可以做得更好的数据结构?或者也许是使用向量的一种解决方法来防止指针失效?你怎么看?
【问题讨论】:
-
首先,没有 STL 之类的东西,或者说您不想处理称为 STL 的东西。您对 C++ 标准库 感兴趣。其次,C++ 标准库中的容器数量非常少,测试它们所需的时间非常短(并且确信您想要的是独角兽)。
-
在标准库中,deque 是唯一的选择。如果你发布了这个需求,那么也许你可以为你的目的创建一个自定义容器,这比 deque 更快。
-
您是否与 pointers-to-elements 相关联?仅追加时元素的索引不会改变,因此您可以存储它
标签: c++ c++11 data-structures stl time-complexity