📜  f64 的 rust sort vec - Rust (1)

📅  最后修改于: 2023-12-03 15:00:41.156000             🧑  作者: Mango

Rust中对f64类型的排序(sort vec)

Rust是一门高性能、系统级编程语言,提供了广泛而且高效的标准库,支持对各种数据类型进行排序操作。本文介绍Rust中对f64类型的排序操作,以及对Vec类型进行排序的实现方法。

使用f64类型进行排序

Rust标准库提供了对各种数据类型进行排序的方法,其中包括对f64类型进行排序的方法。排序的方法定义在std::slice::Sort结构体的trait实现中,使用方式如下:

let mut arr = [3.0, 2.0, 1.0];
arr.sort_by(|a, b| a.partial_cmp(b).unwrap());

其中,sort_by()方法接收一个闭包作为参数,闭包中定义了排序的逻辑,上面的闭包中使用partial_cmp()方法进行比较,由于f64类型存在NaN(Not a Number)值,因此使用partial_cmp()方法比较两个f64类型的值并返回Ordering枚举,从而实现排序。

上述示例中,我们定义了一个由f64类型组成的数组arr,并通过sort_by()方法对该数组进行排序,最终结果为[1.0, 2.0, 3.0]。

除了sort_by()方法,Rust还提供了sort()方法进行排序,sort()方法默认使用partial_cmp()方法进行比较,因此可以直接使用:

let mut arr = [3.0, 2.0, 1.0];
arr.sort();

这里不需要指定比较的闭包,由于f64类型实现了PartialOrd trait,因此sort()方法可以直接使用PartialOrd::partial_cmp()方法进行比较。

对Vec类型进行排序

除了对数组进行排序,Rust还支持对Vec类型进行排序。在排序Vec类型时,我们可以先将Vec转换成slice类型(&[T])再进行排序,最后将排序后的slice重新构造成Vec类型,示例如下:

let mut v = vec![3.0, 2.0, 1.0];
v.as_mut_slice().sort_by(|a, b| a.partial_cmp(b).unwrap());

上述示例中定义了一个由f64类型组成的Vec类型v,并使用as_mut_slice()方法将其转换为可变的slice类型,最后使用sort_by()方法对slice进行排序。注意,直接使用sort()方法会报错,因为sort()方法只能用于slice类型。

排序后,我们可以通过to_vec()方法将slice重新构造成Vec类型:

let mut v = vec![3.0, 2.0, 1.0];
v.as_mut_slice().sort_by(|a, b| a.partial_cmp(b).unwrap());
v = v.as_slice().to_vec();

如果不需要保留原有Vec类型的所有元素,还可以使用drain()方法对原有Vec进行删除操作,最后调用collect()方法将排序后的元素组成新的Vec类型:

let mut v = vec![3.0, 2.0, 1.0];
v.drain(..).for_each(drop);  // 删除所有元素
v.as_mut_slice().sort_by(|a, b| a.partial_cmp(b).unwrap());
v = v.as_slice().iter().cloned().collect();

上述示例中使用drain()方法删除了原有Vec类型中的所有元素,最后使用iter()和cloned()方法生成新的Vec类型。

以上就是本文对Rust中对f64类型的排序操作的介绍,包括了对数组和Vec类型进行排序的实现方法。