集合可以动态更改大小但允许重用对象而不分配内存

时间:2013-04-24 12:00:51

标签: c++

从网络我收到某些条目。这是股票交易所报价,类似:“HP 100 1”,“HP 101 10”,“HP 102 3”等。

一个网络数据包可能包含一个或多个条目。从理论上讲,网络数据包可以包含多少条目:Maximum transmission unit of the network / sizeof(entry)。但是,此限制可能因机器和应用程序的启动位置而异。

每次收到新数据包时,我都需要将条目存储在集合中。我删除了以前的项目,只是在集合中放置新项目。我们假设现在集合包含CURRENT项目数,并且我收到了新项目数量,而不是:

  • 如果NEW< = CURRENT collection应该允许我1)重新配置第一个新项目。 2)将收集长度调整为NEW 3)不要丢弃其余的项目,因为它们将在下一个数据包处理期间重用
  • 如果新> CURRENT集合应该1)确保收集的容量足以存储新项目,如果它不足以调整集合大小并实例化所需数量的项目。 2)允许我重新配置新项目。

所以这个想法很简单:

  • 收集应该增长,不久它的大小应该变成〜Maximum transmission unit of the network / sizeof(entry)
  • 之后不应该分配新对象,只应重新使用和重新配置已分配的对象。即使收集长度减少到1,其余1000个项目也不应该被删除,因为在下一步收集长度将再次变为1000并且我将重复使用这些项目。

如果可以使用任何现有的stlboost集合,或者我必须自己编写?

实际上我可以使用纯数组 - 但是大部分缺失部分都是“自动增长”,因为即使在运行时我也无法计算最大大小。

另一个选择 - 我可以使用任何现有的集合,但另外存储自己的“大小”。永远不要减少集合的大小,而是始终使用“我的”“大小”副本。因为我永远不会减少收藏大小,它永远不会丢弃物品。这应该有效,但有点“棘手”。

1 个答案:

答案 0 :(得分:0)

std::vector的容量会根据需要增加,但不会减少。这似乎符合您的需求。

只需将push个项目放入向量中,并在完成时clear向量。然后将矢量重新用于下一组项目。

或者,您可以resize向量,并将项目放置在给定的index。对于后续的项目集,在相同的向量上反复这样做。

在这两种情况下,载体都将保留其容量。

您甚至可以reserve向量的初始容量。

请注意,从技术上讲,这不会重复使用对象(resize选项中的现有对象除外),但它会重新使用分配的内存。但实际上,由于您每次都在修改对象,因此这应该足够了(尤其是在使用POD对象时)。