В C ++ для копирования содержимого вектора в другой вектор мы используем оператор присваивания dest = src
. Однако в Rust src
будет перемещен в dest
и больше не будет использоваться.
Я знаю, что самый простой ответ - сделать dest = src.clone()
(ради этого вопроса мы примем T
в Vec<T>
это Clone
). Однако - если я правильно понимаю - это создает новый третий вектор с скопированным содержимым src
и перемещает его в dest
, отбрасывая динамически распределенный массив dest
. Если это правильно, это абсолютно ненужное динамическое распределение c, когда мы могли бы просто скопировать содержимое непосредственно в dest
(при условии, что оно имеет достаточную емкость).
Ниже приведена функция, которую я сделал, что делает именно то, что я хотел бы сделать: очистить вектор dest
и скопировать в него элементы src
.
// copy contents of src to dest without just cloning src
fn copy_content<T: Clone>(dest: &mut Vec<T>, src: &Vec<T>) {
dest.clear();
if dest.capacity() < src.len() {
dest.reserve(src.len());
}
for x in src {
dest.push(x.clone());
}
}
Есть ли способ сделать это с помощью встроенных или стандартных библиотечных утилит? Оптимизирован ли dest = src.clone()
компилятором для этого?
Я знаю, что если T
имеет динамические c ресурсы, то дополнительное выделение из src.clone()
не имеет большого значения, но если T
, например, i32
или любой другой тип Copy
, тогда он вызывает выделение, где ничего не требуется.