首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从尾部移除时,将元素添加到数组的头部

从尾部移除时,将元素添加到数组的头部
EN

Stack Overflow用户
提问于 2015-12-14 21:50:37
回答 4查看 736关注 0票数 1

我有一个恒定大小的数组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.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-14 23:06:39

如果需要对数组内容的线性访问,并且不希望执行频繁的memcpy操作,则可能的解决方案是翻转缓冲区滑动缓冲区

翻转缓冲区是数组所需大小的两倍(或者更大,如果您愿意的话),这样您就可以在添加到末尾时只移动一个尾指针,而不需要任何环绕,使数据保持线性。

当您到达基础缓冲区的硬限制时,您将执行幻灯片操作:将数组的上半部分移动到下半部分,并从所有索引中减去相同的增量。

当发生此幻灯片操作时,您知道所有数据和索引现在都在上分区中,因为缓冲区(即2 * N )从未包含比N条目更多的内容:它模拟的是一个N大小的环形缓冲区。也就是说,永远不会出现尾已经到达缓冲区末尾的情况,但是头仍然在较低的分区中(比N项更多)。

由于您想要添加到前面,我们首先填充上面的分区,然后向上翻转:

代码语言:javascript
运行
复制
 [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添加到头和尾:

代码语言:javascript
运行
复制
 [x x x x x x | 2 1 0 9 8 7 ]
            H             T

注意,由于这两个分区不重叠,所以我们不必使用memmove:我们可以使用memcpy

票数 2
EN

Stack Overflow用户

发布于 2015-12-14 21:58:17

如何使用来自memmove()<string.h>来移动数组的切片?在没有实际测量性能的情况下,这是不能排除的。任何使用链接列表的解决方案都可能涉及比高度优化的memmove() (编译器甚至可能内联)更长的操作。

这真的取决于

  • 数组中的元素数。
  • 元素类型的大小。
  • 手术的频率
  • 修改数组与其他所有内容相关的时间。
票数 2
EN

Stack Overflow用户

发布于 2015-12-14 21:55:24

您需要的是索引偏移量。因此,每次“插入”值时,只需将它们写入虚拟尾所在的位置,并更新索引偏移量。循环缓冲区就是这样工作的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34277254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档