![](/img/trans.png)
[英]How do I explictly collect a vector of itertools::MinMaxResult?
[英]How do I collect the values of a HashMap into a vector?
我在文檔中找不到將HashMap
的值收集到Vec
的方法。 我有score_table: HashMap<Id, Score>
並且我想將所有Score
放入all_scores: Vec<Score>
。
我很想使用values
方法( all_scores = score_table.values()
),但它不起作用,因為 values 不是Vec
。
我知道Values
實現了ExactSizeIterator
特征,但我不知道如何將迭代器的所有值收集到向量中,而無需手動編寫 for 循環並將向量中的值一個接一個地推入。
我也嘗試use std::iter::FromIterator;
但以如下內容結束:
all_scores = Vec::from_iter(score_table.values());
expected type `std::vec::Vec<Score>`
found type `std::vec::Vec<&Score>`
感謝Hash map 宏拒絕類型檢查,失敗並出現誤導性(並且看似錯誤)的錯誤消息? ,我將其更改為:
all_scores = Vec::from_iter(score_table.values().cloned());
並且不會對cargo check
產生錯誤。
這是一個好方法嗎?
Iterator.collect
方法就是為這個特定任務而設計的。 你是對的,如果你想要一個實際值的向量而不是引用(除非存儲的類型實現Copy
,如原語),你需要.cloned()
,所以代碼如下所示:
all_scores = score_table.values().cloned().collect();
在內部, collect()
只使用FromIterator
,但它也推斷輸出的類型。 有時沒有足夠的信息來推斷類型,因此您可能需要顯式指定所需的類型,如下所示:
all_scores = score_table.values().cloned().collect::<Vec<Score>>();
如果您不再需要score_table
,您可以通過以下方式將Score
值的所有權轉移到all_scores
:
let all_scores: Vec<Score> = score_table.into_iter()
.map(|(_id, score)| score)
.collect();
這種方法將比@apetranzilla 的克隆方法更快並且消耗更少的內存。 它還支持任何結構,不僅是實現Clone
的結構。
使用.clone()
時,您會顯式復制 value ,這會更慢。 如果您打算之后繼續使用哈希圖,這很好。
但是,如果您不想在之后保留score_table
,請使用HashMap.into_values
。 它將返回值的擁有迭代器:
let all_scores: Vec<Score> = score_table.into_values().collect();
與其他答案相比, HashMap.values
的迭代器不擁有並返回引用( &Score
)而不是值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.