2013-04-24 44 views
0

從網絡我收到某些條目。這是證券交易所的報價,類似於:「HP 100 1」,「HP 101 10」,「HP 102 3」等。集合動態更改大小,但允許重用對象並且不分配內存

一個網絡數據包可能包含一個或多個條目。從理論上講,網絡數據包可能包含多少條目是有限制的:Maximum transmission unit of the network/sizeof(entry)。但是,此限制可能會因所使用的機器和應用程序的啓動而有所不同。

每當我收到新的數據包,我需要將條目存儲在集合中。我放棄以前的項目,只是將新項目放入集合中。讓我們假設現在收藏包含的項目目前有多少,我已經收到物品的新號碼,比:

  • 如果有新的< =集流應該讓我1)重新配置第一個新項目。 2)將收集長度調整爲NEW 3)不丟棄剩餘的項目,因爲它們將在下一個數據包處理期間被重用
  • 如果NEW> CURRENT collection應該1)確保收集容量足以存儲NEW項目,如果它不足以調整集合的大小和安裝所需數量的項目。 2)允許我重新配置新項目。

這樣的想法很簡單:

  • 收集要長,不久它的大小應該成爲以後〜Maximum transmission unit of the network/sizeof(entry)
  • 沒有新的對象應分配,只有已分配的對象應該被重複使用和重新配置。即使收集長度減少到1,其餘1000個項目也不應該丟失,因爲在下一步收集長度將再次變爲1000,我將重新使用這些項目。

如果任何存在stlboost集合可以像使用或我必須寫我自己?

其實我可以使用純數組 - 但大多數缺失的部分是「自動增長」,因爲即使在運行時我也無法計算最大大小。

另一種選擇 - 我可以使用任何現有的集合,但另外存儲自己的「大小」。永遠不要減小集合的大小,而是始終使用「我的」「大小」副本。由於我從不縮小收藏大小,它永遠不會丟棄物品。這應該有效,但會有點「棘手」。

回答

0

std::vector的容量根據需要增加,但不減少。這似乎符合你的需求。

只需push項目到矢量,clear矢量完成後。然後重新使用這個矢量作爲下一組物品。

或者,您可以將resize作爲向量,並將項目放置在給定的index處。對後續項目組重複同樣的矢量操作。

在這兩種情況下,矢量將保留其容量。

您甚至可以爲reserve載體的初始容量。

請注意,從技術上講,這不會重用對象(resize選項中的現有對象除外),但它會重新使用分配的內存。但實際上,由於您每次都在修改對象,因此這應該足夠了(特別是在使用POD對象時)。

+0

假設矢量有1個項目,現在容量是2.我怎麼能增加它的大小爲2,然後重新配置第二項?注意'push'將不起作用,因爲我沒有什麼可以實際推動的。我需要獲得現有物品,重新配置並增加尺寸。 – javapowered 2013-04-24 12:15:40

+0

['std :: vector :: resize'](http://en.cppreference.com/w/cpp/container/vector/resize)允許您將矢量調整爲2,之後您可以訪問第二項並根據需要填充它。 – 2013-04-24 12:18:03

+0

如果你想存儲的東西「在舊地方」,然後找到舊的,像這樣'index = v.find(stuff_to_find);/*檢查索引是否有效*/v [index] = new_value;' – 2013-04-24 12:22:17