2011-04-12 58 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上找到它。