首页 > 解决方案 > 在稳定的生锈中,如何将最小值移出数组,删除其他值?

问题描述

我有一个固定大小[T; SIZE]的 T 类型值的数组,它是有序的(它实现了Ord,但不一定是Cloneor 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()) }
    }

当然,我对此不太满意……有没有更安全、更简洁的解决方案?

标签: arraysrustmove-semanticsunsafe

解决方案


在 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
}

游乐场

相关问题:


推荐阅读