首页 > 解决方案 > 交换向量

问题描述

我需要将一个向量的值分配给另一个向量,例如:

let mut vec_a: Vec<f64> = vec![0.1; 100];
let mut vec_b: Vec<f64> = vec![0.1; 100];

// Do something with vec_a. Real vectors are ~1e6 long    
unsafe {
    vec_b = Vec::from_raw_parts(&vec_a, vec_a.len(), vec_a.len());
}

我正在寻求帮助来回答这些问题:

有没有更有效和更安全的方法来做到这一点?

unsafe如果一切都由同一个应用程序/代码处理,为什么它必须在代码下?

Vec::from_raw_parts如果它是正确的方法,如果代替use会有区别std::slice::from_raw_parts吗?

这种需求背后的原因是避免复制数据。这可能会以很高的频率发生,并且每次,一个向量将作为存储来跟踪最佳解决方案(比如说vec_a),另一个将探索其他解决方案。当找到更好的解决方案时,唯一需要更改的是pointer向量,现在vec_a存储找到的最佳解决方案,vec_b并且vec_b可以继续探索不同的解决方案。

标签: arraysvectorrustcopy

解决方案


天真的答案是相当有效的。一个简单的赋值 ( best_solution = solution) 不会对元素进行深度复制,它只会转移所有权并破坏源。

let mut best_solution = vec![0.1; 100];
loop {
    let solution = generate_solution();
    if solution > best_solution {
        best_solution = solution;
    }
}

为了提高性能,您可以做的一件事是通过使用持久性 vec 作为暂存空间来减少分配(您可能在帖子中的代码中得到了这一点)。在这种情况下,您将使用std::mem::swap以避免破坏暂存 vec。

let mut best_solution = vec![0.1; 100];
let mut scratch_solution = vec![0.1; 100];
loop {
    generate_solution(&mut scratch_solution);
    if scratch_solution > best_solution {
        std::mem::swap(&mut best_solution, &mut scratch_solution);
    }
}

推荐阅读