跟踪布尔数据

时间:2011-04-12 15:03:25

标签: c++ list boolean bits

我需要跟踪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

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

我有一些想法:

  
    

bool的矢量(这需要移位元素,因此看起来很昂贵)     将其存储为位...并使用位移(memorywise --cheap?但是样本数量是否有限制?)     链接列表? (可能对任务来说太过分了)

  

感谢您的想法和建议:)

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

听起来像是一个完美的环形缓冲区。遗憾的是标准库中没有一个,但你可以使用boost。

当您需要覆盖旧元素时,使用固定长度的std::listsplice头节点交替滚动自己的尾部。

答案 2 :(得分:1)

这实际上取决于您想要保留多少个样本。 vector<bool>可能是一个有效的选择;我期待一个 erase()对第一个要素合理有效。 否则,有deque<bool>。如果你知道有多少元素 你想保持编译时,bitset<N>可能更好 比任何一个。

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

答案 3 :(得分:0)

如果你只需要8位......然后使用字符并进行逻辑转换“&lt;&lt;,&gt;&gt;”并做一个面具来看你需要的那个。

  • 16位 - 简短
  • 32位 - int
  • 64位 - 长
  • 等...

示例:

最旧的00110010最新 - &gt;最旧的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));

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

答案 4 :(得分:0)

根据您的问题,您不清楚您打算如何处理样品。如果您只关心存储N个最新样本,则可以尝试以下操作。我会为#34; chars&#34;做这件事。并让你弄清楚如何优化&#34; bool&#34;如果你需要那个。

char buffer[N];
int samples = 0;

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

一旦您存储了N个样本(一旦您将记录调整次数称为N次),您就可以阅读最旧和最新的样本:

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

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

如果您打算在已经存储N个样本之前阅读最旧的样本,事情会变得有点棘手 - 但不是那么棘手。为此,你需要一个&#34;环形缓冲区&#34;你可以在boost和维基百科上找到它。