簡體   English   中英

如何將 HashMap 的值收集到向量中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM