gpt4 book ai didi

rust - 如何在 Rust 中交换向量、切片或数组中的项?

转载 作者:行者123 更新时间:2023-11-29 07:43:26 25 4
gpt4 key购买 nike

我的代码是这样的:

fn swap<T>(mut collection: Vec<T>, a: usize, b: usize) {
let temp = collection[a];
collection[a] = collection[b];
collection[b] = temp;
}

Rust 非常确定我不允许“移出取消引用”或“移出索引内容”,无论是什么。我如何让 Rust 相信这是可能的?

最佳答案

有一个 swap method defined for &mut [T] .自Vec<T>可以是mutably dereferenced作为&mut [T] ,这个方法可以直接调用:

fn main() {
let mut numbers = vec![1, 2, 3];
println!("before = {:?}", numbers);
numbers.swap(0, 2);
println!("after = {:?}", numbers);
}

要自己实现它,您必须编写一些不安全的代码。 Vec::swap is implemented像这样:

fn swap(&mut self, a: usize, b: usize) {
unsafe {
// Can't take two mutable loans from one vector, so instead just cast
// them to their raw pointers to do the swap
let pa: *mut T = &mut self[a];
let pb: *mut T = &mut self[b];
ptr::swap(pa, pb);
}
}

它从向量中获取两个原始指针并使用 ptr::swap 安全地交换它们。

还有一个 mem::swap(&mut T, &mut T) 当您需要交换两个不同的变量时。这不能在这里使用,因为 Rust 不允许从同一个向量中进行两次可变借用。

关于rust - 如何在 Rust 中交换向量、切片或数组中的项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25531963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com