【发布时间】:2016-08-10 14:45:18
【问题描述】:
是的,我又来了一个非常直接的实现,就像这样:
// write data always! if buffer is already full, overwrite old data!
void Put( const CONTENT_TYPE &data )
{
buffer[ inOffset++] = data;
inOffset%=size;
// was data overwritten, skip it by increment read offset
if ( inOffset == outOffset )
{
outOffset++;
outOffset%=size;
std::cout << "Overwrite" << std::endl;
}
}
CONTENT_TYPE Pull()
{
CONTENT_TYPE data = buffer[ outOffset++ ];
outOffset %= size;
return data;
}
但是这个简单的算法只使用了 size-1 个缓冲区的元素!
如果我想避免这种情况,我只找到了添加另一个计数器变量的解决方案,这浪费了我 sizeof(counter_var) - sizeof(element) 个字节。
问:有没有不浪费内存的解决方案?它看起来如此简单,但我无法理解:-)
备注:还有一些代码行可以保护空读取和其他内容,但这对问题并不重要。而且它没有被标记为 c++,因为算法不依赖于语言,如果我给出一个 c++ 代码示例也是如此。
【问题讨论】:
-
您的第一句话似乎表明这是对某事而不是问题的答案;也许您想改写一下;此外,语言标记总是一个好主意。
-
@MarcusMüller:改变了第一句话,语言对于这里的算法并不重要。
-
我认为您可以通过将偏移变量之一替换为大小变量来解决此问题。
-
@Klaus 我谦虚地不同意
-
@klaus 我仍然不能 100% 确定我理解您要解决的 问题。您能否更清楚地说明您真正想要实现的内容?
标签: c++ algorithm circular-buffer