根据索引删除循环中向量的元素
假设我有一个向量,值从 1 到 10。我希望如果您发现 5 和 5 彼此相邻,请将它们与下一个元素一起删除。
输入
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]
预期产出
[1, 2, 3, 4]
这是我的尝试。我正在寻找要删除的索引,但借用规则使我陷入困境。
let mut element = vec![1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10];
for (index, val) in element.iter().enumerate() {
if *val == 5 {
if let Some(next_val) = element.get(index + 1) {
if *next_val == 5 {
//element.drain(index..);
}
}
}
}
回答
Rust使您免于迭代器失效(其他语言中常见的错误来源)。这是一个错误,通常在您尝试修改数据结构并同时对其进行迭代时发生。调用element.drain(index..). 因此,您需要break在该点之后添加一个以避免内存不安全。
在这种情况下,只需添加break;就足以使代码编译。但是,要获得更简洁、线性的解决方案,请充分利用标准库提供的迭代器和方法:
if let Some(index) = element.windows(2).position(|pair| pair[0] == pair[1]) {
element.truncate(index);
}
windows(2)在切片上给出长度为 2 的子切片的迭代器,position调用返回该迭代器的第一个元素的索引,其中切片的两个元素相等。(如果不存在这样的对,则position返回None。)
我发现position使用(当前不稳定的)array_windows功能关闭变得更加明显:
if let Some(index) = element.array_windows().position(|[x, y]| x == y) {
element.truncate(index);
}
操场
有关的
- 是否可以就地过滤矢量?