rust - 在不同集合中使用 String 及其指针的安全有效方式

标签 rust

  • 我有一堆长的不可变字符串,我想将它们存储在 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

playground link

为了避免这种克隆,我找到了两个解决方法:

有什么明智的方法可以消除这种过度克隆吗?

最佳答案

在我看来,您正在寻找的是字符串实习。有一个图书馆,string-cache ,它是作为 Servo 项目的一部分开发的,可能会有帮助。

无论如何,基础很简单:

  • String 的长期池, 这保证他们根本不会移动
  • 避免在池中插入重复项的查找系统

您可以使用 typed arena存储您的 String , 然后存储 &str到那些字符串而不复制它们(只要竞技场存在,它们就会存在)。使用HashSet<&str>在顶部以避免重复,你就设置好了。

关于rust - 在不同集合中使用 String 及其指针的安全有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205905/

相关文章:

rust - gstreamer rust 为 x264enc 上设置的比特率获取人类可读的输出

iterator - 在 map 闭包中生成新序列时出现奇怪的类型错误

rust - "Unrecognized option ' 在 Release模式下使用 rustc 编译时发布 '"

time - 如何在 Rust 中对程序进行基准测试?

generics - 如何在 Rust 中使用泛型类型的内部可变性?

rust - 匹配宏中的多种枚举类型

rust - if else 内部借用时临时值(value)下降

linux - Rust 无法在 Linux 中编译为可执行文件

rust - 如何将 Rust `Vec<T>` 暴露给 FFI?

database - 随着记录的增长,mongoldb文档更新的性能下降