Verwenden einer benutzerdefinierten Vergleichsfunktion mit BTreeSet

9

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?

    
thirtythreeforty 01.12.2015, 19:17
quelle

1 Antwort

7

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
  • reduziert wird

Beachten Sie außerdem, dass der Zugriff auf die umschlossene Entität syntaktisch leicht ist, es sind nur zwei Zeichen: .0 .

    
Matthieu M. 02.12.2015, 07:44
quelle

Tags und Links