将一个向量的所有内容移动到一个新向量中

fad*_*bee 0 memory-management vector rust

要使用旧向量(我想清空)的内容创建一个新向量,我将使用:

foo.bar = my_vector.drain(0..).collect();
Run Code Online (Sandbox Code Playgroud)

这是惯用的 Rust 吗?

Drain() 是否已优化掉,原始向量的内存是否已分配给新向量?

或者每个元素都被一一复制到新的堆分配中?

pro*_*-fh 5

我会做

foo.bar = std::mem::take(&mut my_vector);
Run Code Online (Sandbox Code Playgroud)

这是一个更通用的解决方案。

std::mem::take()改变其参数以窃取其内容并将其保留为默认状态。被盗内容用于创建相同类型的新值。

实际的窃取操作是结构本身的简单字节交换(a Vec、a String、任何其他容器的一些指针/整数...)。存储的元素(可能是堆分配的)保留在原处,因此最终此操作非常便宜(复制然后清除很少的字节,即sizeof结构)。

  • [甚至有一个(默认警告!)Clippy lint!](https://rust-lang.github.io/rust-clippy/master/#/drain_collect) (2认同)