E 'possibile lanciare oggetto della classe a * vuoto?
Domanda
Sto cercando di utilizzare qsort
da STL a sorta gamma di bordo:
struct edge
{
int w,v,weight;
};
in peso. Quello che sto cercando è:
int compare_e(const void *a, const void *b)
{
return ( *(edge *)a->weight - *(edge *)b->weight );
};
Ma ottengo:
`* vuoto const' non è un puntatore a oggetto tipo
EDIT: thx Ok, ora il mio codice viene compilato ma una sorta sembra non funzionare al 100% ...
#include <cstdlib>
#include <iostream>
struct edge
{
int w,v,weight;
};
struct edge_ID:edge
{
int id;
};
int compare_e(const void *a, const void *b)
{
return ( ((edge *)a)->weight > ((edge *)b)->weight );
};
int main()
{
using namespace std;
edge *tab = new edge[100];
for(int i = 0; i < 100; i++)
{
tab[i].weight = rand() % 100;
cout << i << " => " << tab[i].weight << endl;
}
qsort(tab, 100, sizeof(edge), compare_e);
cout << "AFTER:" << endl;
for(int i = 0; i < 100; i++)
{
cout << i << " => " << tab[i].weight << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Ho qualche numero al posto sbagliato ...
Soluzione
struct less_by_weight
{
bool operator()(const edge& lhs, const edge& rhs) const
{
return lhs.weight < rhs.weight;
}
};
int main()
{
const std::size_t size = 100;
edge *tab = new edge[size];
for(int i = 0; i < size; ++i)
{
tab[i].weight = rand() % size;
std::cout << i << " => " << tab[i].weight << '\n';
}
std::sort( tab, tab+size, less_by_weight() );
std::cout << "AFTER:" << '\n';
for(int i = 0; i < size; ++i)
{
std::cout << i << " => " << tab[i].weight << '\n';
}
return EXIT_SUCCESS;
}
Altri suggerimenti
Si può fare:
int compare_e(const void *a, const void *b)
{
return ((edge *)a)->weight - ((edge *)b)->weight ;
}
, ma se si sta scrivendo codice C ++, non riesco a vedere alcun motivo per farlo - perché avete bisogno di utilizzare questa funzione compare_e
? È necessario ((const edge *)a)->weight - ((const edge *)b)->weight
.
Non utilizzare qsort, uso std :: sorta: http: // www .sgi.com / tecnologia / STL / sort.html
E 'necessario una parentesi in più e non si deve risolvere il riferimento il puntatore con *
((edge *)a)->weight
Per rispondere alla tua Inoltre, la funzione compare_e
ora è sbagliato! Mantenere la prima versione che Sottrarre entrambi i pesi.
Una funzione di confronto deve restituire un negativo è A < B
, 0 se A == B
e positivo se A > B
. Si potrebbe implementare utilizzando if/else
ma return A - B
opere in maggior parte dei casi.
In risposta alla tua domanda, non è possibile lanciare un oggetto void*
. I puntatori possono essere lanciati a void*
, ma non oggetti. I riferimenti possono anche essere cast, ma non void*
.
qsort
non è una parte del Template Library C ++ standard, si tratta di una parte del standard C Biblioteca, che è ben diverso.
STL è sicuramente il modo di andare con idiomatica C ++. @ Di SBI spettacoli risposta come utilizzare std::sort
con una serie di puntatori.