In C ++ ist es möglich, den Code std::set
anzupassen, um seine Argumente zu sortieren. Standardmäßig verwendet es std::less
, aber das kann mit dem Compare
Vorlagenparameter.
Rust BTreeSet
scheint das Ord
Merkmal zum Sortieren des Typs. Ich kenne keine Möglichkeit, dieses Verhalten zu überschreiben - es ist in die Typbeschränkung des Typs integriert, der vom Container gespeichert wird.
Es ist jedoch oft sinnvoll, eine Liste von Elementen zu erstellen, die nach einer lokal nützlichen Metrik sortiert sind, die jedoch nicht immer der beste Weg ist, immer zu vergleichen. Oder angenommen, ich möchte Elemente eines Typs use
d sortieren; In diesem Fall ist es unmöglich, Ord
selbst für den Typ zu implementieren, selbst wenn ich das möchte.
Die Problemumgehung besteht natürlich darin, eine einfache alte Vec
der Elemente und sort
danach zu erstellen. Aber das ist nicht so sauber (meiner Meinung nach), als wenn man sie beim Einfügen automatisch anordnet.
Gibt es eine Möglichkeit, alternative Komparatoren mit Rust's Containertypen zu verwenden?
Benutzerdefinierte Vergleicher sind derzeit in den Rust Standard-Sammlungen nicht vorhanden. Der idiomatische Weg zur Lösung des Problems besteht einfach darin, einen neuen Typ zu definieren:
%Vor% Sie können dann eine benutzerdefinierte Ord
Implementierung für Wrapper
mit genau der gewünschten Semantik definieren.
Da Sie einen neuen Typ haben, können Sie außerdem leicht andere Merkmale implementieren, um die Konvertierung zu erleichtern:
convert::From
kann implementiert werden, und Sie erhalten convert::Into
kostenlos ops::Deref<Target = Wrapped>
kann implementiert werden, wodurch das Mapping aufgrund von Auto-Deref Beachten Sie außerdem, dass der Zugriff auf die umschlossene Entität syntaktisch leicht ist, es sind nur zwei Zeichen: .0
.
Tags und Links rust