Frage

Ich habe eine std :: multimap wo Schlüssel eine benutzerdefinierte Klasse ist. So etwas wie folgt aus:

Class X {
public:
    std::string s;
    int x;
    operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;

Nun würde Ich mag upper_bound verwenden und LOWER_BOUND alle Elemente mit dem gleichen Wert von „s“ iterieren. Muss ich einen anderen Betreiber für X (zum Beispiel: ==) implementieren. Oder es wird richtig wie das funktioniert?

Auch, was soll ich als Argument liefern für upper_bound und lower_bound ? Ich nehme an, ich soll ein Dummy-Objekt mit dem gewünschten Wert „s“?

erstellen
War es hilfreich?

Lösung

Da class X der Schlüssel für die multimap ist, um die Parameter upper_bound() / lower_bound() dieser Art sein muss. Wenn class X eine implizite Konvertierung von std::string hat (das ist die Art von X::s ist), dann können Sie, dass als Parameter verwenden / upper_bound() lower_bound().

Der Standardvergleich für multimap ist less<> die einfach operator <() nennt -. So dass der einzige Betreiber ist eine Sie benötigt in class X haben für die multimap arbeiten

Andere Tipps

Sie brauchen nur einen Operator zur Verfügung zu stellen == und <.

upper_bound und lower_bound sind wie jede andere find-Typ-Methode, so dass Sie die gleiche Art von Objekt müssen mit vergleichen - in Ihrem Fall, ein ‚Dummy‘ Objekt mit dem gewünschten Wert von s

.

Bearbeiten : Die Kommentare korrekt sind, dass Sie nur Betreiber benötigen

Die 2 Überlastungen Sie für alle STL-Container benötigen, sind Operator

Natürlich könnte die Frage auch durch die Implementierung eines Vergleichs Funktors in der Karte selbst, nicht unter Berufung auf die Objekte mehr vollständig beantwortet werden. Dies ist oft eine gute Möglichkeit, verschiedene Möglichkeiten der Aufruf find () auf der Karte zu implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top