C ++ STL数据结构通过索引可靠地指向元素的恒定时间推送/弹出/随机访问

时间:2018-08-25 09:42:25

标签: c++ c++11 data-structures stl time-complexity

我一直在研究C ++ STL,但不确定哪种数据结构最适合此特定用例。它需要能够在恒定时间内执行以下三件事:

  1. 恒定时间按索引随机访问(因此可以在恒定时间内选择随机元素)
  2. 仅在末尾恒定时间推送/弹出
  3. 在推入/弹出操作时,指向包含项目的指针不会无效(不在乎迭代器)

最初,我尝试使用矢量;它完全满足前两个条件。但是,我学到了很难的方法,当您将新项目推到向量上时,指向向量元素的指针将失效,因为向量会重新定位自身以保持其所有内存连续。尽管可以通过提前使用向量的reserve()方法来解决问题,但问题是它需要知道我可能需要在其中存储的最大元素数量,而这并不是我需要的值提前知道,我也无法真正计算出来。我也不能只在大小变大时再次使用reserve,因为指向向量元素的指针仍将变为无效。

所以我尝试了双端队列。信不信由你,双端队列实际上完全满足了这三个条件。元素的指针不会因推/弹出而无效,推/弹出是恒定时间。但是,我注意到这是有代价的。双端队列比向量慢大约两倍。我知道双端队列具有附加功能,能够将项目放在最前面,这对我来说是不必要的,,我不确定这是否是附加功能,或者不确定并非所有内存都在持续造成速度下降。

因此,尽管双端队列确实满足了这三个条件,但是C ++ STL中是否存在可以做得更好的数据结构?也许是向量的一种解决方法,可以防止指针失效?你觉得呢?

1 个答案:

答案 0 :(得分:1)

您基本上需要一个std::deque,但是std::deque是基于std::vector的,如果达到了容量并且必须分配一个新的连续内存块({{3} }。由于您不关心迭代器失效,因此这不会打扰您,并且std::deque结构足以满足您的用例。看看Reference。但是,如果只想拥有push/pop接口,请考虑编写包装器。