我想要做的是,我想删除数组的第一个元素,左移其余元素,然后在数组末尾添加一个新元素。
例如,最初的数组是:
Array[5] = {3,7,10,22,5}
删除第一个元素,即' 3',然后将剩余的元素移到左边,然后将一个新值作为输入添加到数组的最后一个索引:
Array[5] = {7,10,22,5,4}
通过这种方式,我想继续向末尾添加一个新元素,并定期删除第一个元素。其目的是实时记录最后一小时的传感器读数(通过每分钟后进行测量)。通过这种方式,我可以实时找出最后一小时的平均传感器值。 帮我解决这个问题。
答案 0 :(得分:3)
换档操作非常昂贵。我们必须迭代while数组并移动每个元素。这是一个更简单,更有效的解决方案:A(简化)circular buffer。
#define size 5
int array[size];
int headIndex = 0;
int removeHeadAddTail(int tail) {
int head = array[headIndex];
array[headIndex] = tail;
headIndex = (headIndex + 1) % size;
return head;
}
答案 1 :(得分:2)
你可能应该选择一个更合适的数据结构,但是如果由于某种原因你坚持使用数组,那么你可以使用memmove
将所有元素向下移动一个,例如。
const size_t N = 5;
memmove(&array[0], &array[1], (N - 1) * sizeof(array[0]);
然后将新值写入最后一个元素:
array[N - 1] = new_value;
答案 2 :(得分:0)
您可以使用指向数组中元素索引的变量。我们称这个变量为minute
。每次进行测量时,都会将传感器值存储在“分钟”位置,如array[minute] = sensorValue;
。然后将minute
增加1.当变量minute
达到60时,将其重置为0。
这样您就不必移动值,但仍可以计算测量值的平均值。
最初,您可以将数组中的值设置为-1(或其他值,具体取决于您的设置),并仅根据非-1的值计算平均值。