作者:LY萍 | 来源:互联网 | 2022-12-09 14:50
是否可以使用Entry
API通过a获取值AsRef
,但是将其插入Into
?
这是工作示例:
use std::collections::hash_map::{Entry, HashMap};
struct Foo;
#[derive(Default)]
struct Map {
map: HashMap,
}
impl Map {
fn get(&self, key: impl AsRef) -> &Foo {
self.map.get(key.as_ref()).unwrap()
}
fn create(&mut self, key: impl Into) -> &mut Foo {
match self.map.entry(key.into()) {
Entry::Vacant(entry) => entry.insert(Foo {}),
_ => panic!(),
}
}
fn get_or_create(&mut self, key: impl Into) -> &mut Foo {
match self.map.entry(key.into()) {
Entry::Vacant(entry) => entry.insert(Foo {}),
Entry::Occupied(entry) => entry.into_mut(),
}
}
}
fn main() {
let mut map = Map::default();
map.get_or_create("bar");
map.get_or_create("bar");
assert_eq!(map.map.len(), 1);
}
操场
我的问题是,总是会创建get_or_create
一个String
遗嘱,导致不必要的内存分配,即使占用的条目不需要它.是否有可能以任何方式解决这个问题?也许以一种整洁的方式Cow
?
1> Shepmaster..:
你不能,安全.这是当前条目API的限制,并没有很好的解决方案.
也可以看看:
[Pre-RFC]以性能名义放弃道德:原始入口API
WIP:将raw_entry API添加到HashMap(50821)
扩展入口API以处理借用的密钥.(1769)
添加HashMap.entry_or_clone()方法(1203)
对于非entry
基于解决方案,请参阅:
如何在为HashMap使用复杂键时避免临时分配?
如何用两个键实现HashMap?