You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:39:03