我使用一种协议(protocol),该协议(protocol)通过索引引用列表中的内容。存储这些东西的自然方式是在一个 vector 中,所以我可以在恒定时间内随机访问。但从本质上讲,在 vector 的开头有很多摆弄,包括插入和删除。指数越低,越乱。 结果是大量复制了 vector 的其余部分。
我想以相反的方式存储东西,在较高的 vector 索引(即较高的地址)处使用较低的协议(protocol)索引,以最大程度地减少内容移动,但仍然能够通过协议(protocol)索引透明地随机访问元素.理想的容器是 std::vector 的直接替代品,除了指针算术和类似的东西。我仍然想要指针运算,但我自己可以处理逆序。
周围有这样的类(class)吗?
也许是一些我找不到的 boost 容器或一些晦涩的政策?
编辑:实际上,令我感到震惊的是,我可以使用一种在索引0
之前和之后保留空间的 vector 长度-1
。 Deque 并不像我想象的那样构建,它使用内存块来代替指针算法。
最佳答案
根据您的描述,听起来好像项目在 vector 的前面插入和删除,导致 vector 的其余部分移动。如果是这样,则意味着您不依赖于停留在特定索引处的项目。这就提出了一个问题,为什么插入和删除在 vector 的前面——以保持排序顺序?
C++ 标准库中有许多容器维护对数时间插入和删除的排序顺序,例如std::multi_set
。
当插入和删除非常本地化时,听起来像(但您不是很清楚),您可能可以使用游标间隙结构,也称为 gap buffer ,将插入和删除减少到恒定时间,保持恒定时间索引。一个成本是索引涉及额外的间接寻址。但这可能是不成熟的优化,因此如果性能很重要,请衡量。
关于c++ - 存储反转数据的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291827/