2011-10-26 8 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; 

のようにそれを試してみましたが、それは仕事をdidntのポインタ切り替えたい: -/

(私もコードをコンパイルcouldntの)

説明のために事前に感謝:)

答えて

0

あなたはコンセプトを混合しています:はポインタです、items[i]はITEMです、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]; 

が、この場合には、スイッチングコードはできませんがあなたの配列にポインタを格納しているわけではないので、ポインタを使用します。

問題に多大な切り替え状況がない場合は、動的割り振りオーバーヘッドのためITEM **を使用しないことをお勧めします。

+0

私はすでにコードを書き直しましたが、「動的割り当てのオーバーヘッド」と「ITEM * *」を使用しない理由を教えてください。 今、私はこれが好きですが(大きなメモリを割り当てることに問題があります): 'ITEM * * items; items =(ITEM * *)malloc(sizeof(ITEM * *)* set.pathc); for(i = 0; i SetFullPath(); } ' とmemでの並べ替え( - > temp、 - > first、temp-> second)。しかし、私はその遅いと思う。 – Buksy

+0

通常、新しい/ mallocを使用する動的割り当ては、通常のスタック作成およびコピー操作よりもオーバーヘッドを生成します。たくさんのアイテムを持っていない場合は、操作をあまり並べ替えていないので、コンテナ内のスタックとアイテムのコピー操作を試すことができます。しかし、アイテム数が非常に多く、コンテナが通常は非常にソートされていない場合、ポインタを切り替えることでより良いパフォーマンスが得られます –