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