< 返回版块

bell 发表于 2021-07-24 23:19

Tags:struct,rust,函数指针,trait

结构体数据结构 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了解了但是没找到 此处如何使用?

评论区

写评论
作者 bell 2021-07-25 09:14

感谢!

--
👇
peacess: 不用dyn就可以解决的,在self.compare外面加上括号就可以了,如下

if right<arr.capacity() && (self.compare)(arr[right],arr[left]) { child=right; }

peacess 2021-07-25 09:05

不用dyn就可以解决的,在self.compare外面加上括号就可以了,如下

if right<arr.capacity() && (self.compare)(arr[right],arr[left]) { child=right; }

1 共 2 条评论, 1 页