我正在实现一个合并排序,它将对类型为T
的数组进行排序。在我的merge
方法中,算法要求左侧和右侧列表的最后一个元素为正无穷大。如何获得给定数据类型可以容纳的最大值?
fn merge<T: PartialOrd + Copy + std::fmt::Debug>(p: usize, q: usize, r: usize, array: &mut Vec<T>) {
let left_size: usize = q - p;
let right_size: usize = r - q;
let mut left: Vec<T> = Vec::new();
let mut right: Vec<T> = Vec::new();
for i in 0..left_size {
left.push(array[p + i]);
}
for i in 0..right_size {
right.push(array[q + i]);
}
left.push(T::max_value()); //where I would put the max value
right.push(T::max_value()); //where I would put the max value
let mut i: usize = 0;
let mut j: usize = 0;
for k in p..r {
if left[i] <= right[j] {
array[k] = left[i];
i += 1;
} else {
array[k] = right[j];
j += 1;
}
}
}
答案 0 :(得分:4)
据我所知,目前没有办法使用标准库。解决这个问题的一种方法是制作自己的特质,添加另一个与merge
绑定的特征,并为你期望的类型实现你的特质。
u32
的特定特征实现将返回std::u32::MAX
,依此类推其他类型。
这是discussion from earlier this year。
如下oli_obk - ker pointed out所示,num
包已经具有以下特征:Bounded
。
答案 1 :(得分:1)
对于通用上限,您还可以将该类型包装在枚举中:
#[derive(Clone, Copy, PartialEq, PartialOrd, Debug)]
enum UpperBounded<T> {
Value(T),
Max,
}
derived order is documented在Value(_)
之前对Max
进行排序。
UpperBounded<T>
可以用于left
和right
向量。