我想构建一个 HashSet<u8>
来自Vec<u8>
.我想做这个
- 一行代码,
- 只复制一次数据,
- 仅使用
2n
内存,
但我唯一能编译的就是这段..垃圾,我认为它复制了两次数据并使用了3n
。内存。
fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> {
let mut victim = vec.clone();
let x: HashSet<u8> = victim.drain(..).collect();
return x;
}
我希望写一些简单的东西,像这样:
fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> {
return HashSet::from_iter(vec.iter());
}
但这不会编译:
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, _>`
.. 我不太理解错误消息,可能是因为我需要 RTFM。
最佳答案
因为操作不需要消耗向量¹,我认为它不应该消耗它。这只会导致程序中其他地方的额外复制:
use std::collections::HashSet;
use std::iter::FromIterator;
fn hashset(data: &[u8]) -> HashSet<u8> {
HashSet::from_iter(data.iter().cloned())
}
像hashset(&v)
一样调用它其中 v
是 Vec<u8>
或其他强制切片的东西。
当然有更多的方式来写这个,通用等等,但这个答案坚持只介绍我想关注的事情。
¹这是基于元素类型 u8
是Copy
,即它没有所有权语义。
关于vector - 从 Rust 中的向量构建 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39803237/