Baue HashSet aus einem Vektor in Rust

8

Ich möchte ein HashSet<u8> von einem Vec<u8> erstellen. Ich würde das gerne machen

  1. in einer Zeile Code,
  2. kopiert die Daten nur einmal,
  3. verwendet nur 2n Speicher,

aber das einzige, was ich kompilieren kann, ist dieses Stück .. Junk, das ich denke, kopiert die Daten zweimal und verwendet 3n Speicher.

%Vor%

Ich hatte gehofft, etwas Einfaches zu schreiben, so:

%Vor%

aber das wird nicht kompiliert:

%Vor%

.. und ich verstehe die Fehlermeldung nicht wirklich, wahrscheinlich weil ich RTFM brauche.

    
Jared Beck 01.10.2016, 05:08
quelle

2 Antworten

11

Eine andere Alternative:

Da die Operation den Vektor¹ nicht konsumieren muß, sollte sie nicht verbrauchen . Das führt nur zu einem zusätzlichen Kopieren an anderer Stelle im Programm:

%Vor%

Nenne es wie hashset(&v) wobei v eine Vec<u8> oder eine andere Sache ist, die zu einem Slice führt.

Es gibt natürlich mehr Möglichkeiten, dies zu schreiben, generisch zu sein und all das, aber diese Antwort bleibt dabei, nur das einzuführen, worauf ich mich konzentrieren wollte.

¹Dies basiert darauf, dass der Elementtyp u8 Copy ist, d. h. er besitzt keine Besitz-Semantik.

    
bluss 01.10.2016, 07:52
quelle
11

Folgendes sollte gut funktionieren; Es erfüllt Ihre Anforderungen:

%Vor%

from_iter() funktioniert bei Typen, die IntoIterator implementieren, also ein Vec Argument ist ausreichend.

Zusätzliche Anmerkungen:

  • Sie müssen nicht explizit return function results angeben; Sie müssen nur das Semikolon im letzten Ausdruck in seinem Körper weglassen

  • Ich bin mir nicht sicher, welche Version von Rust Sie verwenden, aber auf der aktuellen stable (1.12) to_iter() existiert nicht

ljedrz 01.10.2016 05:43
quelle

Tags und Links