Wie funktioniert die vergleichen Funktion std::map in C++ funktionieren, wenn es reflexiv wahr?

Ich habe eine Karte in meinem Projekt.
Jedes mal, wenn ich das einfügen ein neues element, ich will, um sicherzustellen, dass die Schlüssel für das neue element einzufügen ist, die mindestens eine minimale Breite, abgesehen von anderen Elementen in der map. Dazu schrieb ich eine benutzerdefinierte Klasse vergleichen wie diesem:

class PulseCompare
{
public:
    PulseCompare(int minwidth_):minwidth(minwidth_){};
    bool operator()(const int x, const int y) const {
        if(abs(x-y)>minwidth) return false;
        else return true;
    }
private:
    int minwidth;
};

erstellt und die Karte wie diese:

std::map<int,float,PulseCompare> pulsemap(PulseCompare(256));

und bevor ich ein element einzufügen verwende ich die map.find Methode wie diese:

if ( pulsemap.find(1600) == pulsemap.end() ) {
  //not found so I can insert
} else {
  //found
}

Aber das problem ist, dass wenn die Karte versucht reflexartig vergleichen mit den oben genannten vergleichen Funktion durch vertauschen der Werte von x und y, wäre es ein true für beide Fälle das in der Regel nicht der Fall mit den normalen Vergleichsoperatoren wie < und >

Auf dem cplusplus Dokumentation std::map::key_comp hier es sagt, und ich zitiere

Vergleich Objekt von einer map-Objekt wird festgelegt, auf Bau. Ihr Typ (Mitglied key_compare) ist das Dritte template-parameter der map-Vorlage. Standardmäßig ist dies ein Gegenstand weniger, das gibt das gleiche wie operator "<".

Dieses Objekt bestimmt die Reihenfolge der Elemente im container: es ist ein Funktionszeiger oder ein Objekt Funktion, die zwei Argumente des gleichen Typs wie die element-Tasten, und gibt true zurück, wenn das erste argument wird als zu gehen, bevor der zweite in der strict weak ordering definiert ist, und false sonst.

Beiden Schlüssel werden als gleichwertig angesehen, wenn key_comp gibt false zurück, reflexiv (D. H., egal, in welcher Reihenfolge die Schlüssel übergeben werden als Argumente).

Aber nicht sagen, über einen Fall, wo es reflexartig true. Kann mir jemand sagen, was sein Verhalten dann? Oder sollte ich dies tun, Intervall-Vergleich nur durch Iteration über die gesamte Karte?

  • Sie wollen wissen, was passiert, wenn a>b und b>a... Gott, ich hoffe, das Universum ist nicht kaputt
  • Ich bin mir nicht sicher, wie Sie Sie auch std::map<int,float> pulsemap(PulseCompare(256)); ist arbeiten
  • übergeben Sie den Gegenstand vergleichen, als constructor-argument
  • Könnten Sie bitte sagen, wie genau dein Beispiel hier, (Aktien den link) habe ich noch nie verwendet.
  • furchtbar Leid. nur klar, dass es war ein Tippfehler es. Ich hatte zu geben, vergleichen Sie die Klasse in der template-bevor ich es über den Streit. Ich bearbeitet jetzt. Ich denke, jetzt, es macht die Dinge klar.
InformationsquelleAutor Vivek V K | 2014-07-11
Schreibe einen Kommentar