- 我有一堆长的不可变字符串,我想将它们存储在
HashSet
中。 - 我需要一堆以这些字符串为键的映射。
- 我想使用对这些字符串的引用作为这些映射中的键,以避免复制字符串。
这就是我最终达到这种状态的方式。唯一的问题是我需要在第 5 行制作这个额外的副本。
let mut strings: HashSet<String> = HashSet::new(); // 1
let mut map: HashMap<&String, u8> = HashMap::new(); // 2
// 3
let s = "very long string".to_string(); // 4
strings.insert(s.clone()); // 5
let s_ref = strings.get(&s).unwrap(); // 6
map.insert(s_ref, 5); // 7
为了避免这种克隆,我找到了两个解决方法:
- 对字符串使用
Rc
(增加开销和 code clutter ) - 使用unsafe code
有什么明智的方法可以消除这种过度克隆吗?
最佳答案
在我看来,您正在寻找的是字符串实习。有一个图书馆,string-cache ,它是作为 Servo 项目的一部分开发的,可能会有帮助。
无论如何,基础很简单:
String
的长期池, 这保证他们根本不会移动- 避免在池中插入重复项的查找系统
您可以使用 typed arena存储您的 String
, 然后存储 &str
到那些字符串而不复制它们(只要竞技场存在,它们就会存在)。使用HashSet<&str>
在顶部以避免重复,你就设置好了。
关于rust - 在不同集合中使用 String 及其指针的安全有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205905/