如我answer question中所述,我将使用向量仅调整大小为N,读取和写入第n个元素,其中n< N.如果n太接近于N,那么我将创建另一个大小为N + M的向量,并将所有元素从第一个向量复制到第二个并删除第一个向量。因此,如果我正在进行内存管理而不进行插入和删除,那么使用向量而不是数组有什么优势吗?
P.S。很少需要调整大小和阻止复制。
编辑: 正如大卫罗德里格斯 - 运动要求的那样,这是一项技术分析计划。历史股票价格保持为向量中的OHLC条形图。所以我真的需要将元素存储在向量中。还有一些其他计算类称为指标,根据股票价格进行计算。当一个新的价格通过tcp到达时,首先,股票更新它的柱形并立即调用其所有相关指标的计算方法,说,“好吧我的第n个酒吧已经在这个特定的时间更新了。自己去计算。”所有操作都是基于任务的,也就是说,在完成最后一次更新之前,库存永远不会自行更新,类似地,指示器在最后一次更新时从不进行计算。一次一项任务。如果新的更新继续过快,它们可以作为任务缓存。因此,股票可以等待其上次更新完成,并且指标可以在计算时同样存储其任务,但股票不能等待其指标完成其工作。这是问题的开始。如果更新到达,则库存首先查看其条形矢量大小并检查是否必须调整大小。如果需要,它会调整其向量的大小,而在上次更新之前可能仍有一些指标仍在工作。指标可能会达到其库存数据,因为数据可能会调整大小。到目前为止,我没有任何问题,因为指标计算已经非常快速地进行。但我很担心。作为一种解决方案,股票可以生成第二个更大的条形向量,并告诉其指标它们可以到达第二个向量以进行即将进行的计算。最后,几秒钟后,对第一个向量的所有访问都会消失,并且可以删除它。
答案 0 :(得分:2)
听起来你真正想要的结构是std::deque
,它可以附加在固定的常数时间内。
实际上,调整大小策略正是std::vector
已经使用过的策略。事实上,它使用的精确策略意味着此操作基本上是O(1),但仅限于很长一段时间内的许多附加。无论如何,似乎没有任何理由重新发明轮子。只需使用std::vector.push_back()
或std::queue.push_back()
答案 1 :(得分:1)
std:vector
的任何专业人士,对于副本,您可以使用memcopy
realloc
调整她的大小。答案 2 :(得分:0)
我阅读了原始问题,我认为可能值得处理多线程,以便保证在增长时不会有任何线程访问容器。
关于手头的特定问题,除非有充分的理由不这样做,否则我总是会在阵列上找std::vector
,如果没有其他原因只是因为已经实施了许多操作而你不需要手动管理内存。
无论如何,在这两个问题中都没有提供很多信息,关于使用模式是什么,消费者线程对数据做了什么(你真的需要将元素保存在向量中吗?线程可以选择一组值并使用它吗?),有什么同步机制(消费者如何得知容器中有额外数据,额外数据何时到达..)所有这些问题与他们的答案可能会提供其他设计的提示。
答案 3 :(得分:0)
我会说在你的情况下,最坏的情况是,矢量不会比动态分配的原始数组更好。可能会更方便。
至于你的困境,这听起来像隐式内存管理会更容易。您可以将传入的数据存储在共享指针中。然后,指标在开始计算时会获取指向所需数据的共享指针。如果有新数据需要使旧数据无效,只需将包含旧数据的库存中的共享指针替换为包含新数据的共享指针即可。任何仍在使用旧数据的指标都可以继续使用它,因为它仍然有一个指向旧数据的共享指针(防止旧数据被清除),并且当使用数据的所有指标完成时,旧数据将被清除。重置他们的共享指针。