2015-01-05 60 views
3

剛開始(嘗試)學習Rust。如何使用「bytestrings」作爲std :: collections :: BTreeMap中的鍵?如何使用字節數組鍵創建BTreeMap?

看來我不能使用[u8],因爲類型需要固定大小。

使用載體,例如,

BTreeMap<Vec<u8>, MyType> 

......看起來很浪費。

我可以嘗試將所有的字節串連接成一個Vec並使用這些切片作爲BTree鍵,但有沒有更好的方法來做到這一點?

+0

什麼最終擁有你的字節串? – Shepmaster

+0

你能解釋一下爲什麼「使用載體看起來很浪費」? – Shepmaster

+0

我只是在考慮過度分配以及矢量有哪些簿記開銷。但我想我可以在將它們放入地圖之前縮小這些矢量。 –

回答

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」,寫作&[u8],作爲關鍵。在這個例子中,我只是創建了一些可丟棄的切片,但你的可能來自某個擁有對象。

+0

我希望能以某種方式讓BTreeMap擁有鑰匙,因爲這是他們唯一需要的地方。如果這是不可能的,我會讓持有BTreeMap的對象也保持所有字節連接的大Vec ,並使用它的切片作爲關鍵字。 –

+0

您無法表達兄弟的生命週期,因此您將無法擁有一個既擁有字節串又具有對這些字節串的引用的對象。不可能確保引用在適當的長度內有效。 – Shepmaster