2011-09-16 11 views
10

Tengo un pequeño problema tratando de ordenar un vector de punteros.Ordenando el vector de punteros

Esto es lo que he hecho hasta ahora:

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); 
    } 
}; 

Mi menos-que trabaja el operador, si escribo de esta manera:

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

¿Por qué especie no llamar al operador ?? ¡Cualquier ayuda sería apreciada! Gracias.

madshov

+0

Gracias chicos lo tengo ahora./mads – madshov

+0

¿Has resuelto tu problema? –

Respuesta

13

Debido a ordenar los valores del puntero, no los Node s que apuntan.

Puede usar el tercer argumento del algoritmo std::sort para especificar un comparador personalizado.

Por ejemplo:

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

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

(tenga en cuenta que este código es sólo una indicación - que tendrá que añadir los controles de seguridad adicionales en caso necesario)

6

Su operator<() funciona con referencias a objetos Node; pero el vector contiene punteros a Node objetos, que no se pueden comparar con esa función. Tendrá que proporcionar explícitamente una función adecuada (una que acepte indicadores como argumentos) para el algoritmo sort().

11

Su operador que no es así toma const Node& argumentos, pero su vector está ordenando Node* s. Debe especificar una función de comparación como el tercer parámetro en 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); 
    } 
}; 

Además, sus necesidades operator< a declararse const.

+1

Podría decirse que 'PointerCompare' podría ser simplemente una función estática. –

+1

El resultado de usar 'operator <()' para comparar punteros generalmente no se especifica como en [expr.rel/2]: _ "Si dos punteros p y q del mismo tipo apuntan a diferentes objetos que no son miembros del mismo objeto o los elementos de la misma matriz o a diferentes funciones, o si sólo uno de ellos es nulo, los resultados de p q, p <=q, and p> = q son no especificado. "_ es posible usar' std :: menos () 'en lugar de' PointerCompare' para lograr esto. – boycy

+0

@boycy - 1) Mi ejemplo nunca compara punteros. 2) 'std :: less ()' ** does ** compara los punteros y, por lo tanto, invoca un comportamiento indefinido. –

Cuestiones relacionadas