我需要跟踪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?但是样本数量是否有限制?) 链接列表? (可能对任务来说太过分了)
感谢您的想法和建议:)
答案 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::list
和splice
头节点交替滚动自己的尾部。
答案 2 :(得分:1)
这实际上取决于您想要保留多少个样本。
vector<bool>
可能是一个有效的选择;我期待一个
erase()
对第一个要素合理有效。
否则,有deque<bool>
。如果你知道有多少元素
你想保持编译时,bitset<N>
可能更好
比任何一个。
在任何情况下,您都必须将标准容器包装在一些容器中 附加逻辑;没有你需要的实际逻辑(那个 环形缓冲区。)
答案 3 :(得分:0)
如果你只需要8位......然后使用字符并进行逻辑转换“&lt;&lt;,&gt;&gt;”并做一个面具来看你需要的那个。
示例:
最旧的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和维基百科上找到它。