2011-04-12 86 views
0

我需要跟蹤n個樣本。我跟蹤的信息是布爾類型的,即某些是真或假。只要我在樣本n + 1上,我基本上想忽略最老的樣本並記錄最新的樣本。保持跟蹤布爾數據

所以說我跟蹤的樣品,我可以有像

OLDEST 0 0 1 1 0 NEWEST

如果下一個樣本爲1,這將成爲

OLDEST 0 1 1 0 1 NEWEST

如果下一個是0,這將成爲...

OLDEST 1 1 0 1 0 NEWEST

那麼在簡單性和內存方面實現這個最好的方法是什麼?

一些想法我有:

矢量布爾的(這需要換擋元件如此看來貴) 把它作爲位......並使用比特移位(memorywise --cheap但是是什麼?有沒有樣本數量的限制?) 鏈接列表? (可能是任務矯枉過正)

感謝您的意見和建議:)

回答

1

聽起來像一個完美的使用環形緩衝區。不幸的是,標準庫中沒有一個,但你可以使用boost。

當您需要覆蓋舊的元素時,使用固定長度的std::listsplice交替滾動您自己的頭節點到尾部。

0

如果你只需要8位...然後使用一個字符,並做邏輯轉移「< <,>>」並做一個掩碼來看看你需要的。

  • 16位 - 短
  • 32位 - 詮釋
  • 64位 - 長
  • 等...

實施例:

最舊00110010最新 - >最舊1001100101最新

完成者:

char c = 0x32; // 50 decimal or 00110010 in binary 
c<<1; // Logical shift left once. 
c++; // Add one, sense LSB is the newest. 

//Now look at the 3rd newest bit 
print("The 3rd newest bit is: %d\n", (c & 0x4)); 

簡單而極其便宜的資源。將是非常非常高的性能。

1

這真的取決於你想保留多少個樣本。 vector<bool>可能是一個有效的選項;我期望第一個元素的 erase()合理高效。 否則,有deque<bool>。如果您知道要在編譯時保留多少個元素 ,bitset<N>可能比兩者中的任何一個要好 。

在任何情況下,您都必須將標準容器換成 附加的邏輯;沒有你需要的實際邏輯( 環形緩衝區)。

0

從你的問題,目前還不清楚你打算如何處理樣品。如果您關心的是存儲N個最近的樣本,則可以嘗試以下操作。我會爲「chars」做這件事,讓你知道如何爲你的需要優化「bool」。

char buffer[N]; 
int samples = 0; 

void record_sample(char value) 
{ 
    buffer[samples%N] = value; 
    samples = samples + 1; 
} 

一旦你存儲N個樣本(一旦你叫record_sample N次),你可以閱讀最古老和最新的樣本,像這樣:

char oldest_sample() 
{ 
    return buffer[samples%N]; 
} 

char newest_sample() 
{ 
    return buffer[(samples+N-1)%N]; 
} 

事情變得有點棘手,如果你打算在你已經存儲了N個樣本之前閱讀最古老的樣本 - 但並不那麼棘手。爲此,你需要一個「環形緩衝區」,你可以在boost和wikipedia上找到它。