根据索引删除循环中向量的元素

假设我有一个向量,值从 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);
}

操场

有关的

  • 是否可以就地过滤矢量?

以上是根据索引删除循环中向量的元素的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>