2013-01-01 16 views
1

我正在尋找一個適當的結構,將會經常更新的大陣列。謝謝你的幫助! 這是背景: 我想畫一條連續的曲線來表示某個時間段內的聲波。爲了準確性,陣列長度將接近44100(CD格式)。我只想表示最後一秒的波形,所以陣列會更新頻率很高 - 每1/44100秒,第一個元素將被消除並且新的最後一個元素將被插入到數組中。什麼是適當的結構,以存儲一個大陣列,將頻繁更新

爲了避免頻繁的「malloc/realloc/new」,我目前的解決方案是使用一個固定大小爲44100的循環隊列,但不知何故,我不覺得這是最合適的解決方案,如果我想動態調整隊列大小,這將是一項沉重的代價。 這種情況應該是相當頻繁的,我想這個問題可能有一些很好的專利。 謝謝你們!

+2

您需要多長時間調整一次?調整大小時是否需要維護現有數據? –

+1

看看'std :: deque' [here](http://en.cppreference.com/w/cpp/container/deque)。 –

+1

關於性能,我看不出如何使用固定長度的單一分配和索引數學來獲得更高的效率,以瞭解之前和當前的波浪在哪裏停止和開始。考慮到你的使用限制,你需要在什麼條件和頻率下調整這個東西?如果它經常出現,我同意Obvlious船長。保持循環索引使用,但將其放在std :: deque的頂部以調整大小。 – WhozCraig

回答

2

我假設你總是在數組中有固定數量的項目。因此,我只是在任何情況下都使用環形緩衝區(不確定這是否是您稱爲「環形隊列」的情況,但我認爲您會使用動態長度?如果是這樣,爲什麼?是否沒有具體的絕對值(和實際)最大),即一個靜態數組具有可變入口點作爲其開始:

const unsigned int buffer_length = 500000; 
float *buffer = new float[buffer_length]; 

unsigned int buffer_write = 0; 

// append a value... 
buffer[buffer_write] = my_value; 
// ...and move the write/end position: 
buffer_write = (buffer_write + 1) % buffer_length; 

要輸出/使用的值,則可以使用下面的公式中的第一條目,以讀取的索引:

unsigned int start_position = (buffer_length + buffer_write - length_to_read) % buffer_length; 

要進行迭代,只需在位置之後添加位置,再次使用模數跳回到數組的開頭。

+0

非常感謝!你說得對,在「循環隊列」中,我的意思與你的「環形緩衝區」完全相同。對於動態長度要求,因爲我想允許用戶調整時間間隔,即從1秒的時間間隔到2秒。現在我只使用10秒的緩衝區的最大長度,但不知何故,我覺得它不是很靈活,而且內存消耗太多。 – Pei

+0

您只需及時調整數組大小(即,如果請求的元素數量不再適合)。您只需確保保留現有元素的順序。 – Mario

相關問題