要使用旧向量(我想清空)的内容创建一个新向量,我将使用:
foo.bar = my_vector.drain(0..).collect();
这是惯用的 Rust 吗?
Drain() 是否被优化掉,原始向量的内存被分配给新向量?
或者每个元素都被一一复制到新的堆分配中?
我愿意
foo.bar = std::mem::take(&mut my_vector);
这是更通用的解决方案。
如果您希望
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
“空”,但没有容量。