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

问题描述 投票:0回答:2

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

foo.bar = my_vector.drain(0..).collect();

这是惯用的 Rust 吗?

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

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

rust vector memory-management
2个回答
0
投票

我愿意

foo.bar = std::mem::take(&mut my_vector);

这是更通用的解决方案。


0
投票

如果您希望

my_vector
保留其分配,这是移动元素的好方法。从
collect()
Vec
.drain()
只会进行一次新分配以适应所有新元素并将它们移动。这是因为
Drain
迭代器具有已知数量的元素。这将使
my_vector
为空,但保留其原始容量。


如果您不想保留

my_vector
的容量,您只需使用
take
:

foo.bar = std::mem::take(&mut my_vector);

这将从

my_vector
获取全部分配并将其交给
foo.bar
,不会进行任何额外分配,并且
my_vector
将保持默认状态。所以这也会使
my_vector
“空”,但没有容量。

© www.soinside.com 2019 - 2024. All rights reserved.