在环形缓冲区中向后循环的好方法是什么
Whats a good way to loop backwards in a ring buffer?
假设我有一个缓冲区:
static const int BUFFER_SIZE = 3; // for example
int buffer[BUFFER_SIZE];
我想循环通过它
int index = 0;
for( ;; )
{
buffer[index] = ...;
index = (index + 1) % BUFFER_SIZE; // index = 0, 1, 2, 0, 1, 2, 0, 1, 2, ...
}
但是,如果我想向后循环访问缓冲区,会发生什么情况?例如:
0, 2, 1, 0, 2, 1, ...现在我正在这样做:
index = (index <= 0) ? BUFFER_SIZE - 1 : index - 1;
有没有更好的方法来执行这些操作?
本着您第一个决定的精神,我们可以这样写:
int idx = 0;
int i=0;
for (;;) {
buffer[idx] = ...;
i = (i+1) % BUFFER_SIZE;
idx = (BUFFER_SIZE - i) % BUFFER_SIZE;
}
你可以试试这个:
for (int *p = buffer;;) {
if (p == buffer) p = buffer + BUFFER_SIZE;
// these next lines could be combined using the pre-decrement operator
// at expense of some readability
p--;
int index = int(p - buffer); // in case you need the zero-based index
*p = ...;
}
或者这个:
for (int *p = buffer + BUFFER_SIZE - 1;;p--) {
int index = int(p - buffer); // in case you need the zero-based index
*p = ...;
if (p == buffer) p = buffer + BUFFER_SIZE;
}
相关文章:
- 方法内部但循环仍得到预期的不合格id错误C++
- 在 c++ 中实现嵌套循环的更短方法吗?
- 如何在C++中循环访问未知对象方法?
- EnQueue 方法在循环队列中未正确返回C++?
- C++模板方法中的循环依赖关系
- 为什么这种方法会进入无限循环?
- 编写按初始值循环的循环的更好方法是什么
- 循环遍历标准的正确方法::array<char*, N>
- 类方法 - 数据结构中 For 循环的运行时错误
- 循环依赖,在继承类的情况下使用覆盖方法
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- 还有其他方法可以为乘法表编写循环以获取运行时值吗?
- 如何避免模板方法的循环依赖
- 使用虚拟变量对 std::vector 内部循环进行切片的最佳方法
- 有什么方法可以在 c++ 中组织"cycling"(循环)数字?
- C++中的石头剪刀布循环方法
- 对于循环方法调用
- 循环/方法太慢