Vector 如何交换指向数据的变量,而不交换其内容?

Vector 如何交换指向数据的变量,而不交换其内容?,vector,rust,Vector,Rust,在Rust中,通过使两个向量在内存表示中相互指向,是否可以交换两个向量(不隐藏以前的变量) 我正在从C移植一些代码,这在处理指针时非常简单 伪代码(类C): float*a=malloc(大小); 浮球*b=malloc(尺寸); 误差=计算参数(曲线,a); 对于(i=0;i

在Rust中,通过使两个向量在内存表示中相互指向,是否可以交换两个向量(不隐藏以前的变量)

我正在从C移植一些代码,这在处理指针时非常简单

伪代码(类C):

float*a=malloc(大小);
浮球*b=malloc(尺寸);
误差=计算参数(曲线,a);
对于(i=0;i
上面的代码使用每个步骤交换的源/目标阵列将一个阵列细化为另一个阵列

给定两个长度相同且使用基元类型的向量(
float
/
i32
/
usize
…等),如何在Rust中实现这一点


通过阅读
mem::swap()
文档,我不清楚这如何适用于
Vec
类型:“在相同类型的两个可变位置交换值,而不去初始化或复制任何一个。”


据我所知,向量可以就地调整大小并在它们之间复制数据,同时仍然符合给定的描述。

Rust有一个
std::mem
模块,其中包含许多用于此类用例的函数

在本例中,您感兴趣的是,它可以交换两个给定对象的内容。

该函数正是您想要的。举个例子:

let mut a = vec![/* fill this vector */];
let mut b = Vec::new();

loop {
    // do something ...

    std::mem::swap(&mut a, &mut b);
}

swap
根本不涉及向量的内容。它只是交换堆栈上的原始字节(这包括指向数据的指针以及长度和容量字段)。它实际上是“交换名称”。

另外:您的示例包含的详细信息比它需要的要多。您可以用解释发生了什么的注释替换那些
calc
refine
方法。循环也不是真正必要的。看。我想一个好问题是:“我在谷歌上搜索并找到了
mem::swap()
。但我不确定它是交换向量的内容还是指针,就像在我的C示例中一样。”是的,我读过
mem::swap()
,并在某些情况下使用它,但它的措辞和示例并没有完全清楚地表明,对于大型数据结构,常量是不可交换的。(显示交换的2个整数)。例如,文档中说“在同一类型的两个可变位置交换值,而不去初始化或复制任何一个。”-可以编写一个符合此描述的交换函数,逐字节交换数据(只需不运行副本)@LukasKalbertodt,你可能是对的,在这种情况下,我不确定要简化多少,有时过度简化会让人不清楚为什么要进行操作,答案可能不符合实际用例。-例如,如果不在嵌套范围内,可以使用阴影来交换变量。
let mut a = vec![/* fill this vector */];
let mut b = Vec::new();

loop {
    // do something ...

    std::mem::swap(&mut a, &mut b);
}