我有一个恒定大小的数组x(通常在100到200项左右),并且希望在头部添加一个常数小的数组y(通常在2-10个条目之间),同时在末尾移除相同的大小。例如:
缓冲区:X=6 5 4 3 2 1
在前面添加的新数组:y=8 7
结果缓冲区:X=8 7 6 5 4 3
等等..。
注意:我需要使用一个普通的C数组,并且需要能够访问整个数组,而不仅仅是头或尾。数组相当小,但是函数经常被调用,所以我正在寻找一种不需要任何过多内存任务的解决方案。数组x和y在每一步中总是大小相同。
这是缓冲区、循环/环形缓冲区、队列还是FIFO?我真的不知道什么是适合这个应用程序的搜索词。
语言是C.
发布于 2015-12-14 23:06:39
如果需要对数组内容的线性访问,并且不希望执行频繁的memcpy操作,则可能的解决方案是翻转缓冲区或滑动缓冲区。
翻转缓冲区是数组所需大小的两倍(或者更大,如果您愿意的话),这样您就可以在添加到末尾时只移动一个尾指针,而不需要任何环绕,使数据保持线性。
当您到达基础缓冲区的硬限制时,您将执行幻灯片操作:将数组的上半部分移动到下半部分,并从所有索引中减去相同的增量。
当发生此幻灯片操作时,您知道所有数据和索引现在都在上分区中,因为缓冲区(即2 * N )从未包含比N条目更多的内容:它模拟的是一个N大小的环形缓冲区。也就是说,永远不会出现尾已经到达缓冲区末尾的情况,但是头仍然在较低的分区中(比N项更多)。
由于您想要添加到前面,我们首先填充上面的分区,然后向上翻转:
[x x x x x x | 6 5 4 3 2 1 ] -- six-element queue, twelve el. buffer
H T
Add 8 7, remove 2 1:
[x x x x 8 7 | 6 5 4 3 x x ]
H T
Add 2 1 0 9, remove 6 5 4 3:
[2 1 0 9 8 7 | x x x x x x ]
H T头部命中-1!使用memcpy翻转到上分区,将6添加到头和尾:
[x x x x x x | 2 1 0 9 8 7 ]
H T注意,由于这两个分区不重叠,所以我们不必使用memmove:我们可以使用memcpy。
发布于 2015-12-14 21:58:17
如何使用来自memmove()的<string.h>来移动数组的切片?在没有实际测量性能的情况下,这是不能排除的。任何使用链接列表的解决方案都可能涉及比高度优化的memmove() (编译器甚至可能内联)更长的操作。
这真的取决于
发布于 2015-12-14 21:55:24
您需要的是索引偏移量。因此,每次“插入”值时,只需将它们写入虚拟尾所在的位置,并更新索引偏移量。循环缓冲区就是这样工作的。
https://stackoverflow.com/questions/34277254
复制相似问题