0

我需要跟踪 n 个样本。我正在跟踪的信息是布尔类型的,即某事是真还是假。一旦我在样本 n+1 上,我基本上想忽略最旧的样本并记录有关最新样本的信息。

所以说我跟踪样本,我可能有类似的东西

最旧的 0 0 1 1 0 最新的

如果下一个样本是 1,这将变为

最旧的 0 1 1 0 1 最新的

如果下一个是0,这将成为......

最旧的 1 1 0 1 0 最新的

那么在简单性和内存方面实现这一点的最佳方法是什么?

我的一些想法:

布尔向量(这将需要移动元素,因此看起来很昂贵)将其存储为位......并使用位移位(内存--便宜?但样本数量有限制吗?)链接列表?(可能是任务的过度杀伤力)

感谢您的想法和建议:)

4

5 回答 5

2

你想要一组位。也许您可以查看 std::bitset

http://www.sgi.com/tech/stl/bitset.html

使用起来非常简单,优化内存消耗,可能是最好的性能

唯一的限制是您需要在编译时知道 n 的值。如果您想在运行时设置它,请查看 boost http://www.boost.org/doc/libs/1_36_0/libs/dynamic_bitset/dynamic_bitset.html

于 2011-04-12T15:07:22.113 回答
1

听起来像是对环形缓冲区的完美使用。不幸的是,标准库中没有,但您可以使用 boost。

当您需要覆盖旧元素时,交替使用固定长度std::list并将头节点滚动到尾部。splice

于 2011-04-12T15:07:01.293 回答
1

这实际上取决于您要保留多少样本。 vector<bool>可能是一个有效的选择;我希望 erase()第一个元素是相当有效的。否则,有deque<bool>. 如果您知道要在编译时保留多少元素,那bitset<N>可能比这两者都好。

在任何情况下,您都必须将标准容器包装在一些额外的逻辑中;没有一个具有您需要的实际逻辑(环形缓冲区的逻辑)。

于 2011-04-12T15:16:38.357 回答
0

如果您只需要 8 位......然后使用 char 并进行逻辑移位“<<,>>”并做一个掩码来查看您需要的那个。

  • 16 位 - 短
  • 32 位 - 整数
  • 64 位 - 长
  • ETC...

例子:

最旧 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));

简单且极其便宜的资源。将是非常非常高性能的。

于 2011-04-12T15:07:05.683 回答
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 和维基百科中找到它。

于 2011-04-12T19:14:44.367 回答