我正在尝试为循环缓冲区实现收缩操作。 缓冲区有一个开始指针(m_start)并存储元素的数量(m_numelements)。当缓冲区已满时,我只清除旧值。
假设我们有一个16号的数组。 m_start = 9 m_numelements = 11。
我想将这个数组缩小为一个大小为8的数组(可以丢弃元素)。
这里的约束是旧数组的m_start(9)应映射到新数组的m_start%新容量(9%8 = 1)。
我尝试编写代码但最终得到了很多if-else梯形图。这个有效的实现吗?
答案 0 :(得分:0)
让我们的存储阵列具有从零开始的索引,并且它的大小是2的幂(2,4,8 ...),m_start是起始索引。
阵列增长时:
double array length
if m_start > 0 then
copy (m_start elements) from (0th index) to (old size index)
示例:
3 0 1 2|. . . .
. 0 1 2|3 . . .
当数组缩小时:
if m_start > 0 then
copy (m_start elements) from (newsize index) to (0th index)
half array length
示例:
. 0 1 2|3 . . .
3 0 1 2|. . . .
您可以修改此方案以进行基于一的数组索引。
答案 1 :(得分:0)
收缩相当于将整个内容出列到临时缓冲区,然后将该缓冲区的内容排入具有指定容量的新循环缓冲区。这不是你想要的,但它将告知代码必须是什么样的。
所以:编写代码以使循环缓冲区的整个内容出列,并使用您已有的方法将它们排入新的循环缓冲区,然后内联您使用的方法中包含的代码,然后重构该代码以放置内容进入现有的循环缓冲区(调整大小后)而不是新的缓冲区,并优化掉任何不必要的副本或案例。