9

我有一个包含值历史的数组,当添加一个新值时,我需要将所有以前的值向左移动一个位置,以释放最旧的值并为下一个值腾出空间。

通过使用 memmove,我可以想到两种方法:

memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr));

或者通过交换指针:

for (i = 0; i != sizeof(arr) - 1; i++) {
   *(arr + i) = *(arr + i + 1);
}

两种方法之间是否存在性能差异,如果没有,建议使用哪一种?

4

4 回答 4

8

有一个更快的选择:

插入、删除和读取都是 O(1)的循环缓冲区。

于 2013-09-02T14:21:11.617 回答
3

它们都具有相同的时间复杂度。性能上的任何其他差异都是由于特定情况造成的,例如 CPU、编译器、memmove 的实现方式以及数组的大小,因此您必须实际测量每种方式的性能,看看什么是最好的。

于 2013-09-02T14:08:39.513 回答
1

我不认为数组是最好的方法,尝试使用链表,你不会有这个问题。

于 2013-09-02T14:11:22.360 回答
0

您可以使用实现为链表或数组的FIFO 队列。根据您的描述,这是最直接的解决方案。

于 2013-09-02T19:55:48.043 回答