将哈希图的值收集到向量中

时间:2019-06-23 12:45:18

标签: rust hashmap

我是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产生错误。

这是一个好方法吗?

2 个答案:

答案 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>>();