Я пытаюсь реализовать свою собственную наивную структуру данных HashMap/HashTable в Rust. Первый шаг — создать таблицу типа Vec<&mut Bucket>
, где type Bucket = Vec<i64>
.
У меня проблемы с заполнением таблицы данными... Я читаю 1 000 000 целых чисел из входного файла и сохраняю их в 100 000 сегментов. Для каждого числа из ввода я назначаю случайное ведро. Сначала я проверяю, существует ли уже ведро, и если да, то вставляю номер в ведро. В противном случае я создаю ведро и сохраняю его в таблице.
При этом я столкнулся с двумя проблемами:
Первая проблема заключается в том, что я получаю сообщение об ошибке '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. Я использую Руст 1.0.0