Chcę zbudować HashSet<u8>
z Vec<u8>
. Chciałbym zrobić toBuduj HashSet z wektora w Rust
- w jednej linii kodu,
- kopiując dane tylko raz,
- używając tylko
2n
pamięć,
ale jedyną rzeczą, mogę dostać się do kompilacja to ten kawałek ... śmieci, który moim zdaniem dwukrotnie kopiuje dane i korzysta z pamięci 3n
.
fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> {
let mut victim = vec.clone();
let x: HashSet<u8> = victim.drain(..).collect();
return x;
}
miałem nadzieję napisać coś prostego, na przykład:
fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> {
return HashSet::from_iter(vec.iter());
}
jednak, że nie będzie skompilować:
error[E0308]: mismatched types
--> <anon>:5:12
|
5 | return HashSet::from_iter(vec.iter());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected u8, found &u8
|
= note: expected type `std::collections::HashSet<u8>`
= note: found type `std::collections::HashSet<&u8, _>`
.. a ja naprawdę nie rozumiem błąd wiadomość, prawdopodobnie dlatego, że potrzebuję RTFM.
Kod i komunikat o błędzie nie pasują do siebie. Musisz mieć na myśli 'iter()' – bluss
FYI: w twoim pierwszym kodzie nie musisz klonować wektora, wystarczy zadeklarować go jako zmienny. Albo przez 'let mut ofiar = vec;' lub na liście argumentów przez: 'fn vec_to_set (mut vec: Vec)'. –
Nie używasz notacji * O * poprawnie. _O (n) = O (2n) = O (3n) = O (c * n) _. Chodzi o to, że stałe nie mają znaczenia. Myślę, że jasne jest, co masz na myśli, ale powinieneś raczej powiedzieć "_2n_ memory" lub coś takiego. – Lii