我正在尝试在Rust中实现我自己的天真HashMap / HashTable数据结构。第一步是创建Vec<&mut Bucket>
类型的表格,其中type Bucket = Vec<i64>
。
我实际上在用数据填充表时遇到问题......我正在从输入文件中读取1 000 000个整数并将它们存储到10万个桶中。对于输入中的每个数字,我分配一个随机桶。我首先检查存储桶是否已经存在,如果存在,我将数字推入存储桶。否则,我创建存储桶并将其存储在表中。
我这样做时遇到两个问题:
第一个问题是在创建存储桶时出现错误'b' does not live long enough
。如果存储区的范围结束,如何保留存储桶?
第二个问题是我正在以可变和不可变的方式借用table
,但我不确定如何避免这种情况。
use std::env;
// other libs...
extern crate rand;
use rand::{thread_rng, Rng};
type Bucket = Vec<i64>;
fn main() {
let mut rng = thread_rng();
let mut nums = // read 1 million i64s, ie. vec![4253564645, 2394887235, ...]
println!("input consumed!");
let mut table: Vec<&mut Bucket> = Vec::new();
for x in nums.iter() {
let key: usize = rng.gen_range(0, 99999);
println!("{}", key);
if let Some(mut b) = table.get(key) { // <-- immutable borrow
b.push(x);
} else {
let mut b = vec![x]; // <-- `b` does not live long enough
table.insert(key, &mut b); // <-- mutable borrow
}
}
}
如果您想运行示例,整个过程就在这里:https://gist.github.com/neektza/f96d8bf92ee66f1c1703
P.S。 我正在使用Rust 1.0.0