【问题标题】:vector that stores reversed data存储反转数据的向量
【发布时间】:2013-01-12 08:57:09
【问题描述】:

我使用的协议是按索引引用列表中的事物。存储这些东西的自然方式是在向量中,所以我可以在恒定时间内随机访问。但是从本质上讲,向量的开头有很多摆弄,包括插入和删除。指数越低,越摆弄。 结果是大量复制向量的其余部分。

我想以相反的方式存储东西,将较低的协议索引存储在较高的向量索引(即较高的地址)上,以最大限度地减少内容转移,但仍然能够按协议索引透明地随机访问元素.理想的容器将是 std::vector 的直接替代品,指针算术等除外。我仍然想要指针算术,但可以自己处理逆序。

周围有这样的课程吗?

也许是一些我找不到的提升容器或一些晦涩难懂的政策?

编辑:实际上,让我感到震惊的是,我可以使用一种在索引0 之前 以及在索引length-1 之后保留空间的向量。 Deque 并没有像我想象的那样构建,它使用大块内存代替,防止指针算术。

【问题讨论】:

  • 你可以使用deque之类的东西。
  • deque 在容器开头提供优化的插入,如果这是您需要的唯一类型
  • map 不起作用有什么原因吗?它是常数时间,虽然比向量慢,但如果你将它“类似数组”用作键,你就可以解决分配问题。
  • @Gabriel 你计时了吗?这是个问题吗? vector 是最快的容器之一,即使是在移动时也是如此。
  • 此问题未指定

标签: c++ vector containers


【解决方案1】:

根据您的描述,听起来好像在向量的前面插入和删除了项目,导致向量的其余部分被移动。如果是这样,这意味着您不依赖于停留在特定索引的项目。这就引出了一个问题,为什么插入和删除位于向量的前面——以保持排序顺序?

C++ 标准库中有许多容器,它们使用对数时间插入和删除来维护排序顺序,例如std::multi_set.

当插入和删除非常本地化时,听起来像(但您不是很清楚),您可能可以使用 光标间隙 结构,也称为 @ 987654321@,将插入和删除减少到恒定时间,保持恒定时间索引。一个成本是索引涉及额外的间接。但这可能是过早的优化,所以如果性能很重要,请MEASURE

【讨论】:

  • 我被动接收数据。发送者也维护这样一个向量,它在提供索引时会考虑插入和删除。
  • @Gabriel:在发送者维护动态索引关联的情况下,标准库容器对您没有帮助,但光标间隙结构可能会帮助您。如果向量很短,那么引入该结构可能不一定会提高性能。直接方法可能是最好的,就像 O(n^2) 算法在足够小的数据集上可以胜过 O(n) 算法一样。
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2015-04-18
相关资源
最近更新 更多