[英]How to extract elements of a vector of strings in Rust?
假設我有以下代碼 :
fn extract() -> Vec<String> {
let data = vec!["aaa".to_string(), "bbb".to_string(), "ccc".to_string()];
vec![data[0], data[2]]
}
在實踐中,我從文件中讀取data
。
顯然,這不會編譯,因為我正在從向量data
拉出字符串,使向量處於未定義狀態。 但是,從概念上講,它應該起作用,因為無論如何我以后都不會使用data
。
我可以使用mem::replace
,但這似乎很瘋狂:
fn extract() -> Vec<String> {
let mut data = vec!["aaa".to_string(), "bbb".to_string(), "ccc".to_string()];
let a = mem::replace(&mut data[0], "".to_string());
let c = mem::replace(&mut data[2], "".to_string());
vec![a, c]
}
我該如何在不克隆字符串的情況下從向量中提取特定元素?
Vec
為此具有特殊的方法。 swap_remove
, remove
(警告,線性復雜度), drain
。 例如,
fn extract() -> Vec<String> {
let mut data = vec!["aaa".to_string(), "bbb".to_string(), "ccc".to_string()];
// order does matter
vec![data.swap_remove(2), data.swap_remove(0)]
}
向量中不能有“孔”。 因此,當您從其中移出某些內容時,您可以更改其余元素的索引(使用remove
或swap_remove
),或將其替換為其他內容。
為什么不按順序使用向量,而忽略不需要的向量呢? 如果需要保存一些元素以備后用,則可以使用data.iter().filter(...).collect()
。 如果確實要避免復制任何字符串,可以將它們包裝在Rc
以便僅復制指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.