सामान्य रूप से एक स्लाइस के अंदर एक श्रेणी से डेटा की प्रतिलिपि बनाने के लिए (ओवरलैप की अनुमति देता है), हम .split_at_mut()
का भी उपयोग नहीं कर सकते हैं।
मैं मुख्य रूप से अन्यथा .split_at_mut()
का उपयोग करूंगा। (, वहाँ कुछ भी आपको लगता है सीमा की जांच ताकि अनुकूलन की? इसके अलावा नहीं जा रहा है बनाता है यदि आपके पास पर्याप्त डेटा की प्रतिलिपि है कि यह तुलना में थोड़ा-बहुत असर है कर रहे हैं?)
वैसे भी, यह है आप कैसे लपेट सकता है std::ptr::copy
(ओवरलैप है प्रतिलिपि, उर्फ memmove) एक सुरक्षित या unsafe
समारोह में।
use std::ptr::copy;
use std::ops::Range;
/// Copy the range `data[from]` onto the index `to` and following
///
/// **Panics** if `from` or `to` is out of bounds
pub fn move_memory<T: Copy>(data: &mut [T], from: Range<usize>, to: usize) {
assert!(from.start <= from.end);
assert!(from.end <= data.len());
assert!(to <= data.len() - (from.end - from.start));
unsafe {
move_memory_unchecked(data, from, to);
}
}
pub unsafe fn move_memory_unchecked<T: Copy>(data: &mut [T], from: Range<usize>, to: usize) {
debug_assert!(from.start <= from.end);
debug_assert!(from.end <= data.len());
debug_assert!(to <= data.len() - (from.end - from.start));
let ptr = data.as_mut_ptr();
copy(ptr.offset(from.start as isize),
ptr.offset(to as isize),
from.end - from.start)
}
fn main() {
let mut data = [0, 1, 2, 3, 4, 5, 6, 7];
move_memory(&mut data, 2..6, 0);
println!("{:?}", data);
move_memory(&mut data, 0..3, 5);
println!("{:?}", data);
}
Playground link
दुर्भाग्यवश ऐसा लगता है कि एक समारोह समान नहीं है 'संग्रह' करने के लिए जो एक इटरेटर से 'IterMut' भरता है। – starblue
यह भी देखें [एक टुकड़ा की मूर्खतापूर्वक प्रतिलिपि कैसे करें?] (Http://stackoverflow.com/q/28219231/155423) – Shepmaster