【发布时间】:2017-02-09 17:21:57
【问题描述】:
我想从Vec<u8> 构建一个HashSet<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。
【问题讨论】:
-
仅供参考:在您的第一个代码中,您不需要克隆向量,只需将其声明为可变。通过
let mut victim = vec;或在参数列表中通过:fn vec_to_set(mut vec: Vec<u8>)。 -
您没有正确使用 O 表示法。 O(n) = O(2n) = O(3n) = O(c*n)。关键是常数无关紧要。我认为您的意思很清楚,但您可能应该只说“2n memory”之类的。
-
谢谢 Lii,如果
O(n) == O(2n)那么正确的表达方式是什么?能够比较n和2n似乎很有用。谢谢。