0

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

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

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

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

所以这个想法很简单:

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

如果任何现有的stlboost集合可以这样使用,还是我必须自己写?

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

另一种选择 - 我可以使用任何现有的集合,但另外存储自己的“大小”。并且永远不要减少集合的大小,而是始终使用“大小”的“我的”副本。因为我从不减少集合大小,所以它永远不会丢弃项目。这应该可行,但会有点“棘手”。

4

1 回答 1

0

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

只需项目推入矢量,完成后清除矢量。然后将向量重新用于下一组项目。

或者,您可以调整向量的大小,并将项目放置在给定的索引处。为后续的项目集在同一个向量上重复执行此操作。

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

您甚至可以为向量保留初始容量。

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

于 2013-04-24T12:10:15.693 回答