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

如何将Vec中尽可能多的元素移至已有切片中?

如何将Vec中尽可能多的元素移至已有切片中?

我来给你捋捋这个需求哈,你现在手里有一个Vec<Foo>类型的src,还有一个可变切片&mut [Foo]的dst,想要把src里的元素尽可能多地移到dst里,具体规则是:

  • 如果src比dst短,那dst的开头部分要替换成src的全部内容,剩下的部分保持原样,同时src最后要变成空的;
  • 如果src和dst长度一样,那dst整个被src的元素替换,src也变成空的;
  • 要是src比dst长,那把dst的所有位置都填满src的前N个元素(N是dst的长度),src剩下后面的元素保留。

我给你写了个实用的Rust函数,直接就能用:

fn move_into_dst<Foo>(src: &mut Vec<Foo>, dst: &mut [Foo]) {
    // 先算出最多能移动的元素数量:取两者长度的最小值
    let count = src.len().min(dst.len());
    // 把src的前count个元素移动到dst的前count个位置
    for (dst_element, src_element) in dst.iter_mut().take(count).zip(src.drain(0..count)) {
        *dst_element = src_element;
    }
}

这个函数的逻辑很清晰:

  1. 用src.len().min(dst.len())确定要移动的元素总数,保证不会超出任何一方的长度;
  2. dst.iter_mut().take(count)拿到dst前count个位置的可变引用,方便我们替换里面的元素;
  3. src.drain(0..count)会把src前count个元素移除,同时返回这些元素的迭代器,这样我们就能直接把元素移动到dst里,不用额外拷贝;
  4. 最后通过zip把两个迭代器配对,逐个完成元素移动。

这样不管是哪一种长度情况,都能完美满足你的需求啦~

备注:内容来源于stack exchange,提问作者Joseph Sible-Reinstate Monica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:23:16