2015-07-20 287 views
0

我需要一個數據結構(用C++)來存儲在最近N秒內獲取的(整數,雙精度)值對。整數是相對毫秒時間戳(保證是單調的),double是實際的數據樣本。什麼是最近n秒內存儲數據點的最佳數據結構

約束:

  1. 每秒的點數不事先已知,但預計不會一旦應用程序開始變化不大。典型值是每秒10點。

  2. 持續時間(即N秒)也不是已知的,可以在執行期間改變。但是當它改變時,我可以清除所有數據並重新開始。典型值是60秒。

  3. 在每次迭代中,將新的點添加到集合的末尾,舊點(即比當前時間早N秒)將從集合中移除。我不需要快速的隨機訪問,但快速插入(尾部)和刪除(頭部)。

我現在正在使用std :: deque,但我有一種感覺,在尾端添加點並從頭端刪除會導致頻繁的重新分配。

有沒有一個標準的方法來做到這一點?或者我應該將自己的「循環列表」包裝器放在std :: vector中?

+0

更好的嘗試樹。或列表。 – 2015-07-20 16:33:58

+0

來自http://en.cppreference.com/w/cpp/container/deque; 「在最後或開始時插入或刪除元素 - 攤銷常量O(1)」我不認爲你會比這更好。重要的問題是你如何處理這些數據?例如,連續訪問是重要的嗎? – MagunRa

+0

「我有一種感覺,在尾端添加點並從頭端刪除會導致頻繁的重新分配」 您有感覺嗎? 'deque'專門用於從末端快速插入和刪除。 – rlbond

回答

0

看起來你可以使用提升circular buffer。 在C++ STL中沒有等價物。

如果你不想依賴boost,那麼在std :: vector上實現一個非縮小循環緩衝區,這並不難。

2

對於「快速插入(尾部)和缺失(頭部)」,std::deque是最佳的,因爲它在O(1)兩端均被插入和刪除。您也可以使用std::queue。標準庫不提供任何更符合給定要求的「高效」。

+0

但是,即使點的數量沒有增加(因爲一個或多個點從頭上刪除),添加新點時最終是否需要重新分配? – Syam

+0

@Syam實現定義。 – Shoe

+2

關於msvc的一個警告:它有一個可笑的微小的_DEQUESIZ爲16,表現爲sizeof(T)> 8 –

相關問題