Rust 循环中按索引删除vector元素:找到连续两个5后截断后续内容
你代码编译失败的原因是遍历vector时持有不可变借用,同时调用修改方法需要可变借用,违反Rust借用规则。正确的做法是先完成只读的索引查找,再执行修改操作,避免同时持有两类借用。
方案1:使用windows方法快速查找相邻元素(推荐)
slice::windows(2)可以返回连续两个元素组成的滑动窗口,配合position方法可以快速定位第一个满足条件的相邻5的起始位置,再调用truncate截断即可:
let mut element = vec![1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]; // 查找第一个相邻两个5的起始索引 let truncate_pos = element.windows(2) .position(|window| window[0] == 5 && window[1] == 5); // 找到则截断数组,保留索引前的所有元素 if let Some(pos) = truncate_pos { element.truncate(pos); } assert_eq!(element, vec![1,2,3,4]);
方案2:兼容原有遍历逻辑的实现
如果你想沿用自己原本的遍历思路,也可以先遍历记录要截断的位置,等遍历结束后再执行删除操作:
let mut element = vec![1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]; let mut cut_pos: Option<usize> = None; // 仅做只读遍历,记录截断位置 for i in 0..element.len().saturating_sub(1) { if element[i] == 5 && element[i+1] ==5 { cut_pos = Some(i); break; } } // 遍历结束后再修改数组 if let Some(pos) = cut_pos { element.drain(pos..); } assert_eq!(element, vec![1,2,3,4]);
内容的提问来源于stack exchange,提问作者Batuhan Aydın
相关产品推荐
相关产品推荐

