2011-09-16 11 views
10

Mam małe problemy z posortowaniem wektora wskaźników.Sortowanie wektora wskaźników

To, co zrobiłem do tej pory:

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 mniej niż dzieła operatora, jeśli napiszę tak:

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

Dlaczego sortowania nigdy wezwać operatora ?? Każda pomoc będzie doceniona! Dzięki.

madshov

+0

Dzięki chłopaki, mam to teraz./mads – madshov

+0

Czy rozwiązałeś swój własny problem? –

Odpowiedz

13

Bo posortować wartości wskaźnika, a nie s Node one wskazują.

Możesz użyć trzeciego argumentu algorytmu std::sort, aby określić niestandardowy komparator.

Na przykład:

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

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

(Zauważ, że ten kod jest tylko wskazówką - musisz dodać dodatkowe kontrole bezpieczeństwa w razie potrzeby)

6

Twój operator<() funkcjonuje na odniesień do Node obiektów; ale wektor zawiera obiekty wskaźniki do Node obiektów, których nie można porównać z tą funkcją. Będziesz musiał jawnie dostarczyć odpowiednią funkcję (taką, która przyjmuje wskaźniki jako argumenty) do algorytmu sort().

11

Twój mniejszy operator bierze argumenty const Node&, ale twój wektor sortuje Node* s. Musisz określić funkcję porównania jako trzeci parametr na 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); 
    } 
}; 

Również twoi operator< musi być zadeklarowana const.

+1

Prawdopodobnie "PointerCompare" może być po prostu statyczną funkcją. –

+1

Wynik użycia 'operator <()' do porównywania wskaźników jest ogólnie nieokreślony, jak na [wyrażenie.rel/2]: _ "Jeśli dwa wskaźniki p i q tego samego typu wskazują na różne obiekty, które nie są członkami tego samego obiektu lub elementy tej samej tablicy lub do różnych funkcji, lub jeśli tylko jeden z nich jest null, wyniki p q, p = q <=q, and p> są nieokreślone. "_ można użyć std ::' mniej () 'zamiast' PointerCompare', aby to osiągnąć. – boycy

+0

@boycy - 1) Mój przykład nigdy nie porównuje wskaźników. 2) 'std :: less ()' ** does ** porównuje wskaźniki, a tym samym wywołuje niezdefiniowane zachowanie. –

Powiązane problemy