gpt4 book ai didi

loops - 从向量中删除相邻的值

转载 作者:行者123 更新时间:2023-12-03 11:46:31 25 4
gpt4 key购买 nike

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

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];
它还应该在 3之后删除三位 7值,但会陷入无限循环。我自己无法找到该错误,如果有人对如何解决此问题有提示,我将非常感激。
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)之后。
我希望查看打印的值,并且我的线索可以指导您自己解决错误。祝你好运! 😃

关于loops - 从向量中删除相邻的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66377885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com