Suppose I have a
Vec and I want to replace it with the contents of an iterator:
let mut v = vec![0, 1, 2, 3];
v = (0..4).map(|x| x * x).collect();
If the original
Vec already had enough capacity allocated, will it reuse its memory, or does the buffer containing
[0, 1, 2, 3] get freed and a new buffer allocated for the result of
It will get freed and a new buffer will be allocated. The
= assignment is always “dumb” and will just replace the old value with the new one.
To achieve a memory reuse in this case, you can use
v.extend((0..4).map(|x| x * x));
See also the (existing)
clone_from and (proposed)
collect_into (huh, the PR seems closed, not sure what’s the status on that).
To expand on the previous comment, note that the clear method promises not to change the allocated capacity of the vector.
Thanks @krdln, this is what I suspected, but I wasn’t sure.
Another thing for the list (though unstable and not relevant for iterators):
ToOwned::clone_into, for writing a slice into an existing