Переключение указателей / значений - PullRequest
0 голосов
/ 26 октября 2011

В моем классе есть массив указателей, которые мне нужно отсортировать. Сортировка работает правильно, я просто не уверен, переключаю ли я просто ссылку на класс, или весь класс ...

Мой код похож на:

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;

но это не сработало: - / (Я даже не смог скомпилировать код)

Заранее спасибо за разъяснения:)

1 Ответ

0 голосов
/ 16 ноября 2011

Вы смешиваете понятия: 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 ** из-за накладных расходов при динамическом выделении.

...