【问题标题】:C++ STL Data Structure Constant Time Push/Pop/Random Access by Index With Reliable Pointers to ElementsC++ STL 数据结构恒定时间推送/弹出/随机访问,通过具有可靠的元素指针的索引
【发布时间】:2018-08-25 09:42:24
【问题描述】:

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

  1. 按索引的恒定时间随机访问(因此可以在恒定时间内选择随机元素)
  2. 仅在最后的恒定时间推送/弹出
  3. 推送/弹出时指向包含项目的指针不能无效(不关心迭代器)

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

然后我尝试了一个双端队列。信不信由你,一个双端队列实际上完美地满足了所有三个标准。指向元素的指针不会因推送/弹出而失效,这是恒定的时间。但是,我注意到这是有代价的。双端队列比向量慢大约两倍。我知道双端队列具有能够将项目放在前面的附加功能,这对我的目的来说是不必要的,我不确定是不是特别是这种附加功能,或者不是所有的内存都是保持连续,这是造成放缓的原因。

虽然双端队列确实满足这三个条件,但 C++ STL 中是否有可以做得更好的数据结构?或者也许是使用向量的一种解决方法来防止指针失效?你怎么看?

【问题讨论】:

  • 首先,没有 STL 之类的东西,或者说您不想处理称为 STL 的东西。您对 C++ 标准库 感兴趣。其次,C++ 标准库中的容器数量非常少,测试它们所需的时间非常短(并且确信您想要的是独角兽)。
  • 在标准库中,deque 是唯一的选择。如果你发布了这个需求,那么也许你可以为你的目的创建一个自定义容器,这比 deque 更快。
  • 您是否与 pointers-to-elements 相关联?仅追加时元素的索引不会改变,因此您可以存储它

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


【解决方案1】:

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

【讨论】:

  • 附加/附加到deque 是常数时间。 vector 只是 amortised 常量附加。
  • 你是对的,但是我不相信它,因为每个 stl 实现在时间复杂度方面都不符合标准。我删除了我的补充,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2011-02-03
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多