arrays - 交换向量
问题描述
我需要将一个向量的值分配给另一个向量,例如:
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
可以继续探索不同的解决方案。
解决方案
天真的答案是相当有效的。一个简单的赋值 ( 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);
}
}
推荐阅读
- gitlab - 恢复备份后 GitLab 错误获取变量
- java - 在 Eclipse 插件的 ViewPart 中更改 Swing JPanel 的大小(尽管 SwingUtilities.invokeLater(Runnable()))
- java - 有没有办法在 Java 图形形状上投射光线?
- java - Netbeans 8.2 安装本机库问题
- android - 带有许多按钮的自定义对话框颤振
- azure - Azure Application Insights 不适用于 React Native
- python - set add() 方法对集合进行排序?
- javascript - 哪些进程会影响性能 django/ajax
- python - 如何在不关闭浏览器的情况下在 Google Colab 上使用 Selenium?
- python - 在 Python 中使用 4GB 写入限制绕过 OSError 'File too large'?