在BinaryHeap中迭代期间修改项目

时间:2014-11-22 03:38:36

标签: rust

目前,Rust中的BinaryHeap未提供iter_mut()功能,如HashMap。这可能是因为BinaryHeap中的项目是在项目值本身上排序的,而不是单独的密钥。

假设我有一个结构:

struct A {
    timestamp : u64,
    data : ...,
    ... : ...
}

PartialEqEqPartialOrdOrd仅取决于timestamp字段。

修改任何其他字段不需要重新排序BinaryHeap中的元素。

是否有更好的方法可以修改BinaryHeap中的项目而无需将其复制到新的BinaryHeap

最初的想法包括仅在timestamp中存储BinaryHeap并使用HashMap存储timestamp -> data,但这会导致维护其他数据结构,并且不会t自动提供键入HashMap的好方法(因为时间戳可能会在BinaryHeap中出现多次)

扩展这个想法,我可以存储{ timestamp, id }的包装对象,但是需要生成唯一的ID(计数器?)

此时,这似乎是一个过于复杂的解决方案......

1 个答案:

答案 0 :(得分:1)

来自(cell模块)的

RefCell可能是您应该探索的内容,它通过插入运行时保证来胜过编译时的所有权保证。

因此,如果您使用通用KeyValue,则可以为BinaryHeap创建此类结构:

struct PartiallyMutable<Key, Value> {
    key: Key,
    value: RefCell<Value>,
}

impl<Key, Value> Eq for PartiallyMutable<Key, Value> where Key: Eq {
    fn eq(&self, &other: &Self) -> bool {
        self.key == other.key
    }
}

// etc...

然后使用&PartiallyMutable<Key, Value>您可以实际修改value字段。