如何在 Rust 中提取字符串向量的元素?
How to extract elements of a vector of strings in Rust?
假设我有以下 code:
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)]
}
向量中不能有 "holes"。因此,当您从其中移出某些内容时,您要么更改剩余元素的索引(使用 remove
或 swap_remove
),要么将其替换为其他内容。
你为什么不按顺序使用向量并忽略你不需要的东西呢?如果需要保存一些元素供以后使用,可以使用data.iter().filter(...).collect()
。如果你真的想避免复制任何字符串,你可以将它们包装在 Rc
中,这样只复制指针。
假设我有以下 code:
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)]
}
向量中不能有 "holes"。因此,当您从其中移出某些内容时,您要么更改剩余元素的索引(使用 remove
或 swap_remove
),要么将其替换为其他内容。
你为什么不按顺序使用向量并忽略你不需要的东西呢?如果需要保存一些元素供以后使用,可以使用data.iter().filter(...).collect()
。如果你真的想避免复制任何字符串,你可以将它们包装在 Rc
中,这样只复制指针。