2012-05-30 76 views
2

我需要存儲最後n個時間值,我正在使用這個向量。我可以做到這一點,它的工作原理,但我的問題是,從長遠來看,矢量會填滿,我可能會用完內存嗎?我正在使用一個stl向量的花車。適當的數據結構來存儲C++中的最後n個元素

要更清楚:我推回來自另一個進程的時間值,我只需要最後5個時間值。

我該如何有效地做到這一點,而不會讓矢量填滿並最終耗盡內存?

回答

6

聽起來好像你想要一個覆蓋值的循環緩衝區。
boost爲例。

3

使用queue - 在這種情況下是完美的。你推入隊列直到它的大小爲5,然後當添加一個新值時,你首先從隊列中彈出,然後進入它。

編輯:如果你需要能夠直接訪問所有5個元素可能deque是一個更好的選擇。我也相信默認的隊列實現是基於deque的。

+0

謝謝,謝謝大家。 – mgr

+0

除非'n'非常大,並且對象拷貝的成本很高,'std :: vector'會比'std :: deque'執行得更好。 –

+1

@JamesKanze你在這裏有什麼意思 - 你爲什麼這麼認爲?我們需要能夠將對象添加到矢量的一端,並從另一端刪除對象。該deque是用於這種用法,我沒有看到爲什麼矢量會表現更好的原因。 –

0

沒記得容器名稱:) 我會使用一個std :: queue容器。所以你可以從另一端刪除而不用擔心序列中的位置。關於線程的東西......我想我不禁要害矢量和列表不是線程安全的。

2

據我所知,隊列(或deque)在其內存使用中不是循環的。相反,它會在需要時增長並偶爾複製以適應。

我建議製作自己的結構。所有你需要的是一個大小爲5的數組,以及'last'項目的指針(或索引),它將被下一個新項目覆蓋。每次添加新值時,「最後」產品覆蓋,「最後」指針向上移動:

last = (last+1)%5; 

確保找到處理開始,那裏有一個好辦法小於5數組中的項目。如果你只是在開始時填入錯誤/中性值的數組,你應該沒問題。

+1

這應該是選擇的答案恕我直言。在這種情況下,沒有std :: container比普通的C風格的固定大小的數組提供了任何優勢。除非你想使用像boost這樣的外部庫,否則這是一條路。 –

相關問題