从向量中删除相邻值

Removing adjacent values from vector

我制作了这个函数,它应该删除它从向量中找到的所有相邻值。

fn remove_adjacent<T: std::cmp::PartialEq>(values: &mut Vec<T>, item: T) {
    let mut offset = 0;

    while let Some(idx) = values.iter().skip(offset).position(|n| *n == item) {
        let length = values
            .iter()
            .skip(idx)
            .position(|v| *v != item)
            .unwrap_or(values.len() - idx);

        if length > 1 {
            values.drain(idx + 1..length + idx);
        }

        offset = idx + 1;
    }
}

它适用于像

这样的向量
vec![2, 1, 3, 3, 3, 3, 3];

但不适用于其目标元素在非目标值之后重复的向量,例如

vec![2, 1, 3, 3, 3, 3, 3, 7, 3, 3, 3];

它还应该删除 7 之后的三个 3 值,但它却陷入了无限循环。我自己找不到错误,如果有人有解决此问题的提示,我将不胜感激。

Example on Rust Playground

除了获取 idx.

之外,您的代码中的所有内容都正常工作

你可以把idx打印出来看看有什么问题。打印 offset 也有帮助。

fn remove_adjacent<T: std::cmp::PartialEq>(values: &mut Vec<T>, item: T) {
    let mut offset = 0;

    while let Some(idx) = values.iter().skip(offset).position(|n| *n == item) {
        dbg!(idx, offset); // prints out nicely

        let length = values
            .iter()
            .skip(idx)
            .position(|v| *v != item)
            .unwrap_or(values.len() - idx);

        if length > 1 {
            values.drain(idx + 1..length + idx);
        }

        offset = idx + 1;
    }
}

您会发现 idx 并不总是您想要的。

发生这种情况是因为 .position( 不在 values 中,而是在 .skip(offset).

之后得到的迭代器中

我希望查看打印的值和我的线索可以指导您自行修复错误。祝你好运!