2011-10-26 39 views
0

我有我需要排序的類的指針數組。 排序工作正常,我只是不知道,林切換是否只是在類或全班參考...切換指針/值

我的代碼是這樣的:

ITEM *items = new ITEM[set.pathc]; 
... 
bool change = true; 
while(change) 
{ 
change = false; 
for(i = 0; i < set.pathc-1; i++) 
{ 
    if(compare(items+i, items+i+1, set.order, set.order_asc)) 
    { 
     ITEM temp; 
     temp = *(items+i); 
     items[i] = items[i+1]; 
     items[i+1] = temp; 

     change = true; 
    } 
} 
} 

所以是我的代碼轉換隻是指針(我的意思是分配對象的地址)或整個對象(如複製所有私有變量,是不是需要「=」運算符?)?

我想改用只是指針,因爲我想這將是非常快多了,我試了一下這樣的

ITEM *temp 
temp = item+i; 
item[i] = item+i+1; 
item[i+1] = temp; 

,但它沒有工作: - /(我想不出甚至編譯代碼)

預先感謝解釋:)

回答

0

你混合概念:temp是一個指針,items[i]是一個項目,items+i+1是一個指針。所以,如果你想使用指針,良好的代碼必須是:

// creating items 
ITEMS **items = new ITEM*[set.pathc]; 
.... 
// for filling data 
for (i = 0; i < set.pathc; i++) 
{ 
    *(items + i) = new ITEM; // new ITEM in pointer 
    (*(items + i))->data = .....; 
} 

..... 
// compare and switching data 
if (compare(*(items + i), *(items + i + 1) .....) 
{ 
    ITEM *temp = *(items + i); 
    *(items + i) = *(items + i + 1); 
    *(items + i + 1) = temp; 
} 

當然,你可以聲明,因爲現在:

ITEM *items = new ITEM[set.pathc]; 

但在這種情況下,切換代碼不能用指針來做,因爲你沒有在你的數組中存儲指針,只是ITEMS。

如果您的問題沒有太多切換情況,我建議不要使用ITEM **,因爲動態分配開銷。

+0

我已經重寫了代碼,但是請問您爲什麼不使用「ITEM * *'」來表示「動態分配開銷」是什麼意思? 現在,我有這樣的(但有分配大內存的問題): 'ITEM * * items; items =(ITEM * *)malloc(sizeof(ITEM * *)* set.pathc);對於(i = 0; i SetFullPath(); }' 和Im使用memcpy( - > temp, - > first,temp-> second)排序。但我猜它很慢。 – Buksy

+0

通常,使用new/malloc進行動態分配會產生比正常堆棧創建和複製操作更多的開銷。如果你沒有太多項目,你可以嘗試在你的容器中使用堆棧和項目複製操作,因爲你沒有太多的排序操作。但是,如果物品數量如此之高,並且容器通常非常分散,通過切換指示器可以獲得更好的性能 –