HashMap
В то время как вектора сохраняют значения с числовыми индексами,
HashMap
сохраняют значения по ключу. Ключи
HashMap
могут иметь логический, числовой, строковый
или любой другой тип данных, который реализует типажи
Eq
и Hash
. Подробнее об этом в
следующей главе.
Как и вектора, HashMap
расширяемые, но они также
могут и сжать себя, когда у них появляется избыточное пространство.
Вы можете создать хэш-карту с определённой размерностью при
помощи HashMap::with_capacity(uint)
или использовать
HashMap::new()
для получения хэш-карты с
размерностью по умолчанию (рекомендуется).
use std::collections::HashMap; fn call(number: &str) -> &str { match number { "798-1364" => "Абонент выключен или находится вне зоны действия сети. Пожалуйста, позвоните позднее.", "645-7689" => "Здравствуйте, это Mr. Awesome's Pizza. Меня зовут Фред. Что я могу сделать для вас?", _ => "Привет! Кто это опять?" } } fn main() { let mut contacts = HashMap::new(); contacts.insert("Даниель", "798-1364"); contacts.insert("Эшли", "645-7689"); contacts.insert("Кейти", "435-8291"); contacts.insert("Роберт", "956-1745"); // Возьмём ссылку и вернём `Option<&V>` match contacts.get(&"Даниель") { Some(&number) => println!("Звоним Даниелю: {}", call(number)), _ => println!("У нас нет номера Даниеля."), } // `HashMap::insert()` вернёт `None`, если мы добавляем // новое значение, иначе - `Some(value)` contacts.insert("Даниель", "164-6743"); match contacts.get(&"Эшли") { Some(&number) => println!("Звоним Эшли: {}", call(number)), _ => println!("У нас нет номера Эшли."), } contacts.remove(&"Эшли"); // `HashMap::iter()` возвращает итератор, который в произвольном // порядке отдаёт пары `(&'a key, &'a value)`. for (contact, &number) in contacts.iter() { println!("Звоним {}: {}", contact, call(number)); } }
Для большей информации о том, как работает хеширование и хэш-карты (который иногда называются хэш-таблицами), вы можете обратиться к Wikipedia.