Использование qsort () с указателями классов - PullRequest
4 голосов
/ 07 февраля 2011

Я использую встроенную функцию qsort() для сортировки вектора из class item указателей.

class item {
int value;
vector<char> c;
...
...
};

//Declaration of vector
vector<item*> items;

//Function Call
qsort(&items, items.size(), sizeof(item*), value_sort);

int value_sort(const void* a, const void* b)
{
item* pa = *(item**) a;
item* pb = *(item**) b;

if (pb->value < pa->value)
    return 1;
else if (pa->value < pb->value)
    return -1;
return 0;
}

В режиме отладчика указатели ни pa, ни pb не указывают на допустимое местоположение.Набор всех элементов данных class items, указанных либо pa, либо pb, содержит значения мусора.Где я делаю ошибку?Я также не уверен в использовании двойных указателей.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

Я согласен с ответами, которые советуем использовать std::sort. Но игнорируя это на данный момент, я думаю, что причина вашей проблемы в том, что вы передаете адрес объекта vector, а не содержимое вектора. Попробуйте это:

//Function Call
qsort(&items[0], items.size(), sizeof(item*), value_sort);

Затем, после того как вы попробуете это, вернитесь и используйте std::sort. 8v)

4 голосов
/ 07 февраля 2011

Не используйте qsort в C ++, используйте std::sort вместо:

int value_sort(item* pa, item* pb)
{
    return pa->value < pb->value;
}

std::sort(items.begin(), items.end(), value_sort);
3 голосов
/ 07 февраля 2011

Использовать std :: sort из algorithm.Он прост в использовании, печатает безопасно и быстрее, чем qsort, и не имеет проблем с указателями:).

#include <algorithm>

inline bool comparisonFuncion( item *  lhs,item  * rhs)
{
    return lhs->value<rhs->value;
}

std::sort(items.begin(),items.end(),comparisonFunction);
...