如何在Rust中提取字符串向量的元素?

问题描述 投票:2回答:2

假设我有以下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]
}

如何从矢量中提取特定元素而不必克隆字符串?

vector rust ownership
2个回答
4
投票

Vec有特殊的方法。 swap_removeremove(警告,线性复杂性),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)]
}

1
投票

你不能在向量中有“洞”。因此,当您移动某些东西时,您要么更改其余元素的索引(使用removeswap_remove),要么将其替换为其他元素。

你为什么不按顺序使用向量而忽略你不需要的东西?如果您需要保存一些元素供以后使用,可以使用data.iter().filter(...).collect()。如果你真的想避免复制任何字符串,可以将它们包装在Rc中,以便只复制指针。

© www.soinside.com 2019 - 2024. All rights reserved.