在 Rust 中是否可以通过让它们指向彼此的内存表示来交换 2 个向量(不隐藏先前的变量)?
我正在从 C 移植一些代码,这在处理指针时非常简单。
伪代码(类 C):
float *a = malloc(size);
float *b = malloc(size);
error = calc_params(curve, a);
for (i = 0; i < REFINE_ITER_MAX; i++) {
/* reads 'a', refines to 'b' */
calc_params_refine(curve, a, b);
error_test = calc_params(curve, a);
if (error_test < error) {
/* How to do this in Rust??? */
float *swap = a;
a = b;
b = swap;
}
else {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码使用每一步都交换的源/目标数组将一个数组细化为另一个数组。
给定两个长度相同并使用原始类型(float/ i32/ usize... 等)的向量,在 Rust 中如何做到这一点?
从阅读mem::swap()文档中,我不清楚这如何适用于Vec类型:“在相同类型的两个可变位置交换值,而不去初始化或复制任何一个。”
据我所知,向量可以就地调整大小并在它们之间复制数据 - 同时仍然符合给出的描述。
该功能std::mem::swap正是您想要的。拿这个例子:
let mut a = vec![/* fill this vector */];
let mut b = Vec::new();
loop {
// do something ...
std::mem::swap(&mut a, &mut b);
}
Run Code Online (Sandbox Code Playgroud)
swap根本不涉及向量的内容。它只是交换堆栈上的原始字节(这包括指向数据的指针以及长度和容量字段)。这真的是“交换名字”。