我是Rust的新手,在文档中找不到将哈希图的值收集到向量中的方法。
假设我有一个哈希图:
score_table: HashMap<Id, Score>
我想将所有Score
放入一个Vec
all_scores: Vec<Score>
我很想使用values
,但由于值不是vec,所以它不起作用:
all_scores = score_table.values()
我知道Values
实现了ExactSizeIterator
特质,但我不知道如何在不手动编写for循环并将值推入vector的情况下将迭代器的所有值收集到向量中一个。
[编辑1]
我也尝试过use std::iter::FromIterator;
,但是却遇到了类似的问题:
all_scores = Vec::from_iter(score_table.values());
expected type `std::vec::Vec<Score>`
found type `std::vec::Vec<&Score>`
[编辑2]
感谢this question,我将其更改为:
all_scores = Vec::from_iter(score_table.values().cloned());
并且不会对cargo check
产生错误。
这是一个好方法吗?
答案 0 :(得分:3)
如果您不再需要score_table
,则可以通过以下方式将Score
值的所有权转移到all_scores
:
let all_scores: Vec<Score> = score_table.into_iter()
.map(|(_id, score)| score)
.collect();
与@apetranzilla的克隆方法相比,此方法将更快并且消耗更少的内存。它还支持任何结构,不仅支持实现Clone
的结构。
答案 1 :(得分:2)
方法Iterator.collect
是为此特定任务而设计的。正确的是,如果需要实际值的向量而不是引用(除非存储的类型实现.cloned()
,例如基元),则需要Copy
,因此代码如下:
all_scores = score_table.values().cloned().collect();
在内部,collect()
仅使用FromIterator
,但它也可以推断输出的类型。有时没有足够的信息来推断类型,因此您可能需要显式指定所需的类型,例如:
all_scores = score_table.values().cloned().collect::<Vec<Score>>();