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 ...

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top