我正在尝试实现 HashMap。基本定义是:
pub struct CLHashMap<K, V> {
buckets: Vec<Vec<(K, V)>>,
count: usize
}
对于调整大小功能,我有这个:
let newSize = ....
let newBuckets = vec![Vec::new(); newSize]; // error here
for mut items in self.buckets.drain(..) {
for (key, value) in items.drain(..) {
let mut hasher = DefaultHasher::new();
key.hash(&mut hasher);
let index = (hasher.finish() % newBuckets.len() as u64) as usize;
newBuckets[index].push((key, value));
}
}
mem::replace(&mut self.buckets, newBuckets);
这会在代码中注释的行处产生错误。
error[E0277]: the trait bound `K: Clone` is not satisfied in `(K, V)`
错误我理解,但我不确定为什么 Rust 需要 V 来实现克隆特征。
这里涉及复制/克隆吗?
您会从“是空的,为什么不能克隆时间?”的角度来思考它。
Vec<T>
n
那么,怎么
vec.clone()
知道它vec
是空的呢?事实并非如此。简而言之,vec![item; n]
只需创建一个Vec<T>
包含n
(克隆)实例的item
.既然
item
是Vec<(K, V)>
,那就(K, V)
必须执行Clone
,否则Vec<(K, V)>
就不执行Clone
。根本不存在这样的事情,这确实
vec.clone_if_empty()
没有意义。要创建
Vec<Vec<T>>
包含n
空的Vec<T>
s,您可以使用,例如iter::repeat_with()
、take(n)
和collect()
:或者