2012-08-23 14 views
8

Ich benutze Sätze. Ich benutze eine benutzerdefinierte Struktur als Schlüssel. Ich füge einen Wert ein und versuche den eingegebenen Wert zu finden. Aber es scheint nie das Element zu finden.C++ std :: set Suche Funktion Überladung == Operator

Ich habe sowohl den Operator == als auch den Operator < außer Kraft gesetzt. Hier

ist der Code der Struktur:

struct distance_t 
{ 
public: 
int id; 
double distance; 

bool operator<(const distance_t& rhs) const 
{ 
    if(distance < rhs.distance) 
     return true; 
    else 
     return false; 
} 

bool operator==(const distance_t& rhs) 
{ 
    if(id == rhs.id) 
     return true; 
    else 
     return false; 
} 
}; 

Und dies ist der Code der Haupt

int main() 
{ 
    set<distance_t> currentSet; 

    distance_t insertDistance; 
    insertDistance.id =1; 
    insertDistance.distance = 0.5; 

    currentSet.insert(insertDistance); 

    distance_t findDistance; 
    findDistance.id = 1; 

    assert(currentSet.find(findDistance) != currentSet.end()); 
} 

Es scheitert immer in der assert-Anweisung. Was mache ich falsch?

Edit -Ok jetzt verstehe ich, dass es den Operator == überhaupt nicht verwendet. Hier ist was ich will. Ich brauche die Datenstruktur nach Entfernung sortiert. Aber ich sollte es mit der ID entfernen können. Gibt es dafür einen sauberen Weg oder eine bereits vorhandene Datenstruktur?

+2

Ein Stilvorschlag: wo hast du 'if (expr) zurück wahr; else return false; 'Sie könnten stattdessen einfach' return expr; ' – Blastfurnace

+1

Was ist falsch mit nur' return id

+0

@Blastofen Sie brauchen auch keine Klammern. –

Antwort

8

Es schlägt fehl, da Ihr weniger als Vergleich distance_t::distance verwendet, die Sie setzen nicht in findDistance:

distance_t findDistance; 
findDistance.id = 1; 

std::set nicht operator== für irgendetwas nicht verwendet. Es verwendet nur operator<. Sie müssten also die Logik ändern, um distance_t::id zu verwenden.

Wenn Sie mit dem id suchen möchten, ohne die Reihenfolge der Reihe zu ändern, können Sie std::find verwenden:

set<distance_t>::iterator it = std::find(currentSet.begin(), 
             currentSet.end(), 
             findDistance); 

Dies wird Ihre operator== verwenden. Bedenken Sie, dass dies eine lineare Zeitkomplexität hat.

+0

Ich möchte die Entfernung verwenden, um die Elemente zu sortieren, möchte aber, dass die ID das Element findet. Ist das überhaupt möglich? –

+1

@TheFlyingDutchman Ordering wird zum Nachschlagen verwendet (Set ist ein Binärbaum). Es ist also nicht möglich, eine entkoppelte Bestellung und Suche zu haben. Sie könnten "id" in die Bestelllogik integrieren, es hängt wirklich davon ab, was Sie erreichen möchten. – juanchopanza

+1

@TheFlyingDutchman Sie können den "Operator <" zuerst die Entfernung anzeigen lassen, und wenn sie gleich sind, sehen Sie sich ID an. Das würde die Reihenfolge erhalten, nach der Sie suchen. (Und ändern Sie 'operator ==', um beide Felder zu betrachten.) Aber das bedeutet, dass Sie nicht suchen können, wenn Sie nur die ID haben. – hvd

4

Weil operator== überhaupt nicht aufgerufen wird. Vergleicht man Elemente wie:

!(a < b) && !(b < a) 

Mit anderen Worten, es operator< verwendet.

1

Da Sie findDistance.distance keinen Wert zugewiesen haben, ist das Ergebnis des weniger als Vergleichs nicht definiert.

Beachten Sie, dass Ihre Definitionen der Operatoren "Gleichheit" und "weniger als Vergleich" gefährlich sind, da es einfach ist, Instanzen von distance_t zu definieren, deren Ergebnis inkonsistent ist. Ein Beispiel sind zwei Instanzen mit der gleichen Entfernung, aber unterschiedlichen IDs.

Verwandte Themen