arrays - 在稳定的生锈中,如何将最小值移出数组,删除其他值?
问题描述
我有一个固定大小[T; SIZE]
的 T 类型值的数组,它是有序的(它实现了Ord
,但不一定是Clone
or Default
)。我想提取数组的最小值并删除所有其他值。
在夜间生锈中,我可以使用它array::IntoIter
来实现这一点,但如果可能的话,我希望我的代码能够在稳定版上编译。
目前,我正在使用以下(游乐场):
// Don't call this function if T has a custom Drop implementation or invalid bit patterns
unsafe fn get_min<T: Ord>(mut arr: [T; SIZE]) -> T {
let (idx, _) = arr.iter().enumerate().min_by(|(_, x), (_, y)| x.cmp(y)).unwrap();
unsafe { replace(&mut arr[idx], MaybeUninit::uninit().assume_init()) }
}
当然,我对此不太满意……有没有更安全、更简洁的解决方案?
解决方案
在 2021 年版的 Rust(在 Rust 1.56 及更高版本中可用)中,into_iter()
数组上的方法返回一个对所拥有项目的迭代器,因此这变得很容易:
fn get_min<T: Ord>(arr: [T; SIZE]) -> T {
arr.into_iter().min().unwrap() // assuming SIZE > 0
}
在早期版本的 Rust 中,您可以将最小值移动到数组的开头,然后使用切片模式将第一个元素移出数组:
fn get_min<T: Ord>(mut arr: [T; SIZE]) -> T {
for i in 1..SIZE {
if arr[i] < arr[0] {
arr.swap(0, i);
}
}
let [min, ..] = arr;
min
}
(游乐场)
相关问题:
推荐阅读
- python - 如何检查Excel文件是否受密码保护?
- c++ - 尝试链接我的着色器时,我收到错误代码“错误 c5145 必须写入 gl_position”
- ios - UITableView 滚动到错误的位置
- node.js - Nodejs:如何将请求数据从一个模块重用到另一个模块?
- docker - 如何将 Kafka 消息通过管道传输到 docker 容器中?
- django - 用户单击按钮时Django添加字段
- swift - 使用编辑器中的属性初始化自定义 SKSpriteNode
- javascript - 如何测试以确定浏览器是否支持 JS 正则表达式前瞻/后瞻?
- python - 将 Matplotlib 和 Sympy 的图放在一起
- python-3.x - 使用端口转发和 network=host 从一个 docker 连接到另一个失败