如何在删除元素时填充数组间隙?

时间:2014-11-09 04:25:45

标签: c arrays

假设我有一些指向某个对象的指针。

foo* bar[256];

并且假设它包含我的缓冲区中所有blitted(blitting)纹理的列表。然后我通过删除请求从阵列中取出一些东西,而我正在起飞的东西不在最后,对。所以数组中有一个空的间隙

(filled memory), (empty), (filled memory), (filled memory), etc

虽然我想在这个例子中它并不重要,但是我如何将数组中的每个条目都放在空白区域之前并将其按回来以便空白区域结束?

抱歉措辞不好,朋友们!

4 个答案:

答案 0 :(得分:2)

转移所有项目需要时间。如果项目的顺序无关紧要,我建议只移动最后一项来填补空白并保持一个大小为int来指定占用的大小。

你应该把它放在一个结构

typedef struct{
 int occupied;
 foo* bar[256];
}

假设我们要删除第k个单元格:

delete(myStruct.bar[k]);
myStruct.bar[k] = myStruct.bar[myStruct.occupied--];

答案 1 :(得分:1)

比如说,你知道bar[128]是空的。

以下循环会将bar[128]之后的所有元素向左移动一个,从而将空白空间留在最后:

for (int k = 129; k < 128; k++) {
   bar[k-1] = bar[k];
}

绝对有可能将此推广到数组中的多个间隙,但这会变得有点复杂。

答案 2 :(得分:0)

int i, j;
for (i=0; i<256; i++) {
    if (!(bar[i])) {
        for (j=i; j<255; j++) {
            bar[j] = bar[j+1];
        }
    }
}

答案 3 :(得分:0)

没有其他方法可以做到这一点,而不是通过数组中位于差距之上并对其进行排序的每个元素。如果这种情况经常发生,则可能会成为性能问题。也许你应该尝试另一种数据结构,比如链表。每个元素都有一个指向它的下一个元素的指针。现在,当你删除列表中间的一个元素时,你只需要将被移除的元素之前的元素指向被移除的元素旁边的元素 - 就是这样,现在你的列表再次排序。