【问题标题】:How do you make a BTreeMap with byte array keys?如何使用字节数组键制作 BTreeMap?
【发布时间】:2015-01-05 20:39:28
【问题描述】:

刚开始(尝试)学习 Rust。如何在 std::collections::BTreeMap 中使用“字节串”作为键?

我好像不能使用 [u8] 因为类型需要固定大小。

使用向量,例如

BTreeMap<Vec<u8>, MyType>

...看起来很浪费。

我可以尝试将所有字节串连接到一个 Vec 中并将其切片用作 BTree 键,但有更好的方法吗?

【问题讨论】:

  • 最终拥有你的字节串的是什么?
  • 你能解释一下为什么“使用向量似乎很浪费”吗?
  • 我只是在考虑过度分配以及向量具有的任何簿记开销。但我想我可以在将它们放入地图之前缩小矢量以适应它们。
  • Vec 本身就是pretty bare-bones,只是一个指针、一个长度和一个容量。缩小它可能很有用,就像把它放在一个地方并只使用切片(它只是一个指针和一个长度)一样。钥匙的大致数量是多少?平均多长时间?是否值得担心这种级别的细节(也就是您是否进行了基准测试)? ^_^

标签: rust


【解决方案1】:
use std::collections::BTreeMap;

fn main() {
    let key1 = b"1234";
    let key2 = b"5678";

    let mut map = BTreeMap::new();

    map.insert(key1, true);
    map.insert(key2, false);

    println!("{}", map);
}

如您所见,[u8] 是一种没有任何大小的类型,这意味着您实际上无法在某处存储其中一个。相反,您需要存储一个“u8s 切片”,写为&amp;[u8],作为密钥。在此示例中,我只是创建了一些一次性切片,但您的切片可能来自某个拥有对象。

【讨论】:

  • 我希望我能以某种方式让 BTreeMap 拥有密钥,因为这是他们唯一需要的地方。如果这是不可能的,我会让持有 BTreeMap 的对象也持有一个大的 Vec 连接的所有字节,并使用它的切片作为键。
  • 您不能表达兄弟姐妹的生命周期,因此您将无法拥有一个既拥有字节串又拥有对这些字节串的引用的对象。无法确保引用在适当的长度内有效。
猜你喜欢
  • 2014-01-07
  • 2010-11-06
  • 2016-01-07
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多