Jak posortować tablicę wskaźników?

0

Witam.
Chciałbym się dowiedzieć w jaki sposób można posortować tablicę wskaźników.
Problem wygląda tak- mam zwykłą tablicę struktur i robię do niej drugą tablicę- wskaźników.
Teraz chciałbym ją przesortować(wskaźniki) w taki sposób żeby oryginalna tablica została nieruszona. Mój kod wygląda tak:

[code]
int DataEngine::struct_cmp_by_product(const void *a, const void *B)
{
struct Tplyta *ia = (struct Tplyta *)a;
struct Tplyta *ib = (struct Tplyta *)b;
return QString::compare(ia->mark,ib->mark);
}

void DataEngine::Sort()
{
Tplyta *tableSort = table; //Przypisanie oryginalne tablicy(table) do wskaźników
qsort(tableSort, rowcount, sizeof(struct Tplyta),struct_cmp_by_product);

}
[/code]

Ten sposób wyżej działa(sortuje), ale zmienia mi oryginalną tablice.

0

Na razie przypisujesz wskaźnik do pierwszego elementu tablicy. Musisz stworzyć tablicę wskaźników do struktur i przypisać kolejnym elementom kolejne wskaźniki oraz musisz zmienić funkcję porównującą, żeby przyjmowała wskaźnik do wskaźnika do struktury.

0

Odnośnie poprawy tablicy wskaźników na struktury to zrobiłem coś takiego:

[code]
int DataEngine::struct_cmp_by_product(const void *a, const void *b){
struct Tplyta *ia = (struct Tplyta *)a;
struct Tplyta *ib = (struct Tplyta *)b;
return QString::compare(ia->mark,ib->mark);
}

void DataEngine::Sort(){

for (int i = 0; i < rowcount; i++)
{
    tableSort[i] = &table[i];
}
qsort(*tableSort, rowcount, sizeof(struct Tplyta*),struct_cmp_by_product);

}
[/code]

Natomiast nie rozumiem w jaki sposób poprawić tę funkcję porównująca. Co w niej jest źle?

1

Jeśli metoda struct_cmp_by_product nie jest metodą klasy (statyczną) to nie zadziała. Skoro piszesz i tak w C++ yo użyj:

std::sort(tableSort, tableSort + rowcount, struct_cmp_by_product); // BTW wtedy funkcja porównująca nie musi przyjmować wskaźników na void tylko wskaźniki na twoje struktury (nie trzeba rzutować)

lub jeśli chcesz użyć C++11 to nawet:

std::sort(tableSort, tableSort + rowcount, [](Tplyta* a, Tplyta* b){ return a->mark > b->mark; });

BTW
Słówko kluczowe struct przed typem struktury w C++ jest zbędne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1