簡體   English   中英

如何在Rust中的向量,切片或數組中交換項?

[英]How can I swap items in a vector, slice, or array in Rust?

我的代碼看起來像這樣:

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

Rust很確定我不允許“脫離引用”或“移出索引內容”,不管是什么。 我如何說服Rust這是可能的?

&mut [T]定義了一個swap方法 由於Vec<T>可以作為&mut [T]被可釋放地解引用 ,因此可以直接調用此方法:

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

要自己實現,必須編寫一些不安全的代碼。 Vec::swap實現如下:

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)還有一個mem::swap(&mut T, &mut T) 這不能在這里使用,因為Rust不允許從同一個向量中取兩個可變的借位。

正如@ gsingh2011所提到的,接受的答案不再是好方法。 使用當前的Rust,這段代碼運行良好:

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

試試吧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM