结构体数据结构 min_heap.rs
pub struct Heap< T>{ vec:Vec, compare:fn(T, T) -> bool //外部比较函数 }
impl <T:Copy> Heap{
//下沉
pub fn down(&mut self,index:usize)-> i32 {
let arr=&self.vec;
if arr.capacity()< index {
return -1;
}
let element =arr[index];
let mut curr=index;
let mut left=curr*2+1;
let mut right=left+1;
while left<arr.capacity() {
//选择左右孩子的最小值进行比较
let mut child=left;
if right<arr.capacity() && self.compare(arr[right],arr[left]) {
child=right;
}
// 待选择的值比孩子大,则将孩子移到当前的槽
if self.cmp(element, arr[child]) <= 0 {
break;
} else {
arr[curr] = arr[child];
// 往下迭代
curr = child;
left = curr * 2 + 1;
right = left + 1;
}
}
arr[curr] = element;
0
}
}
main.rs
mod min_heap;
use min_heap::Heap;
fn cmp(x: i32, y: i32) -> bool { x > y }
fn main(){ let mut heap:Heap=Heap::new(cmp); }
运行发现 self.compare(arr[right],arr[left])这里报错。 上面贴出主要代码 想最小堆中比较函数由外部传入控制,接口保持一直,第一次接触rust没有找到如何解决?求大佬给下思路,dyn了解了但是没找到 此处如何使用?
1
共 2 条评论, 1 页
评论区
写评论感谢!
--
👇
peacess: 不用dyn就可以解决的,在self.compare外面加上括号就可以了,如下
if right<arr.capacity() && (self.compare)(arr[right],arr[left]) { child=right; }
不用dyn就可以解决的,在self.compare外面加上括号就可以了,如下
if right<arr.capacity() && (self.compare)(arr[right],arr[left]) { child=right; }