目前,Rust中的BinaryHeap
未提供iter_mut()
功能,如HashMap
。这可能是因为BinaryHeap
中的项目是在项目值本身上排序的,而不是单独的密钥。
假设我有一个结构:
struct A {
timestamp : u64,
data : ...,
... : ...
}
PartialEq
,Eq
,PartialOrd
和Ord
仅取决于timestamp
字段。
修改任何其他字段不需要重新排序BinaryHeap中的元素。
是否有更好的方法可以修改BinaryHeap
中的项目而无需将其复制到新的BinaryHeap
?
最初的想法包括仅在timestamp
中存储BinaryHeap
并使用HashMap
存储timestamp -> data
,但这会导致维护其他数据结构,并且不会t自动提供键入HashMap
的好方法(因为时间戳可能会在BinaryHeap
中出现多次)
扩展这个想法,我可以存储{ timestamp, id }
的包装对象,但是需要生成唯一的ID(计数器?)
此时,这似乎是一个过于复杂的解决方案......
答案 0 :(得分:1)
cell
模块)的 RefCell
可能是您应该探索的内容,它通过插入运行时保证来胜过编译时的所有权保证。
因此,如果您使用通用Key
和Value
,则可以为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
字段。