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;

しかし、それは機能しませんでした:-/(私はコードをコンパイルすることさえできませんでした)

説明してくれてありがとう:)

4

1 に答える 1

0

概念が混在しています:tempはポインタ、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];

ただし、この場合、ポインターを配列に格納しているのではなく、ITEMS だけを格納しているため、切り替えコードはポインターを処理できません。

問題にあまりスイッチング状況がない場合は、動的割り当てのオーバーヘッドがあるため、 ITEM ** を使用しないことをお勧めします。

于 2011-11-16T14:03:03.420 に答える