如何将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; } }
这个函数的逻辑很清晰:
- 用
src.len().min(dst.len())确定要移动的元素总数,保证不会超出任何一方的长度; dst.iter_mut().take(count)拿到dst前count个位置的可变引用,方便我们替换里面的元素;src.drain(0..count)会把src前count个元素移除,同时返回这些元素的迭代器,这样我们就能直接把元素移动到dst里,不用额外拷贝;- 最后通过
zip把两个迭代器配对,逐个完成元素移动。
这样不管是哪一种长度情况,都能完美满足你的需求啦~
备注:内容来源于stack exchange,提问作者Joseph Sible-Reinstate Monica
相关产品推荐
相关产品推荐

