2014-11-09 46 views
0

可以說我有一些指向一些對象的指針。如何刪除元素時填充數組空隙?

foo* bar[256]; 

並且讓我們說它包含我的緩衝區中所有blitting(blitting)紋理的列表。然後我要求通過刪除從陣列中取出一些東西,而我所起的東西並不是最後的,對。因此,有一個空的幾分差距陣列

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

雖然我在這個例子想這並不重要,但是我怎麼會拿陣列中的每個條目領先於空的空間和排序壓回來這樣空的空間到底了?

對不起的措辭,朋友!

回答

1

比方說,你知道bar[128]是空的。

下面的循環將bar[128]後的所有元素移動到由一個左,並因此離開空的空間底:

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

這肯定是可以概括這在多於一個的間隙你的數組,但這變得有點複雜。

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

沒有其他方法可以做到這一點,而不是通過數組中的每個元素來處理間隙和排序。如果這經常發生,它可能會成爲性能問題。也許你應該嘗試另一種數據結構,如鏈接列表。每個元素都有一個指向下一個元素的指針。現在當你刪除列表中間的一個元素時,你只需要將元素指向被刪除元素旁邊的元素 - 就是這樣,現在你的列表再次被排序。

2

移動所有物品需要時間。如果項目順序不重要,我建議只移動最後一項來填補空白,並保持int大小來指定佔用的大小。

你應該保持在一個結構

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

可以說,我們要刪除第k個單元:

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