2011-09-16 19 views
10

Ho qualche problema a cercare di ordinare un vettore di puntatori.Vettore di ordinamento dei puntatori

Questo è quello che ho fatto finora:

class Node 
{ 
    private: 
    vector <Node*> _children; 
    string _data; 
    ... 
    public: 
    void Node::add_child(Node* child) 
    { 
     ... 
     sort(_children.begin(), _children.end()); 
    } 

    bool Node::operator<(const Node& node) 
    { 
     return (this->_data.compare(node._data) == -1); 
    } 
}; 

My meno-che funziona l'operatore, se scrivo in questo modo:

Node* root = new Node("abc"); 
Node* n = new Node("def"); 
cout << (*root<*n) << endl; 

Perché sorta mai chiamare l'operatore ?? Qualsiasi aiuto sarebbe apprezzato! Grazie.

madshov

+0

Grazie ragazzi, ho capito./mads – madshov

+0

Hai risolto il tuo problema? –

risposta

13

Perché si ordinano i valori puntatore, non i Node s a cui puntano.

È possibile utilizzare il terzo argomento dell'algoritmo std::sort per specificare un comparatore personalizzato.

Ad esempio:

bool comparePtrToNode(Node* a, Node* b) { return (*a < *b); } 

std::sort(_children.begin(), _children.end(), comparePtrToNode); 

(notare che questo codice è solo un'indicazione - si dovrà aggiungere i controlli di sicurezza in più dove necessario)

6

tuo operator<() opera su riferimenti a Node oggetti; ma il vettore contiene puntatori da a Node oggetti, che non possono essere confrontati con quella funzione. Dovrai fornire esplicitamente una funzione adeguata (una che accetta i puntatori come argomenti) all'algoritmo sort().

11

L'operatore di meno che utilizza gli argomenti const Node&, ma il vettore è in ordine Node* s. È necessario specificare una funzione di confronto come terzo parametro su std::sort.

class Node 
{ 
    private: 
    vector <Node*> _children; 
    string _data; 
    struct PointerCompare { 
     bool operator()(const Node* l, const Node* r) { 
     return *l < *r; 
     } 
    }; 
    public: 
    void add_child(Node* child) 
    { 
     sort(_children.begin(), _children.end(), PointerCompare()); 
    } 

    bool operator<(const Node& node) const 
    { 
     return (this->_data.compare(node._data) == -1); 
    } 
}; 

Inoltre, i vostri operator< deve essere dichiarato const.

+1

Probabilmente, 'PointerCompare' potrebbe essere solo una funzione statica. –

+1

Il risultato dell'uso di 'operator <()' per confrontare i puntatori è generalmente non specificato come per [expr.rel/2]: _ "Se due puntatori p e q dello stesso tipo puntano a oggetti diversi che non sono membri della stessa oggetto o elementi dello stesso array o per funzioni diverse, o se uno solo di questi è nullo, i risultati di p q, p = q <=q, and p> sono specificato. "_ Si può usare' std :: meno () 'invece di' PointerCompare' per ottenere ciò. – boycy

+0

@boycy - 1) Il mio esempio non confronta mai i puntatori. 2) 'std :: less ()' ** fa ** confronta i puntatori e quindi richiama il comportamento non definito. –