HashMap
На відміну від векторів, які зберігають значення за цілочисельним індексом, HashMaps зберігають значення за ключем.
Ключами HashMap можуть бути булеві значення, цілі числа, рядки
або будь-який інший тип, що реалізує трейти Eq і Hash.
Докладніше про це — у наступному розділі.
Як і вектори, HashMaps можна збільшувати, але HashMap також можуть зменшуватися,
коли мають надлишок вільного місця.
Ви можете створити HashMap із певною початковою місткістю за допомогою
HashMap::with_capacity(uint), або використати HashMap::new(), щоб отримати HashMap
із початковою місткістю за замовчуванням (рекомендовано).
use std::collections::HashMap;
fn call(number: &str) -> &str {
match number {
"798-1364" => "We're sorry, the call cannot be completed as dialed.
Please hang up and try again.",
"645-7689" => "Hello, this is Mr. Awesome's Pizza. My name is Fred.
What can I get for you today?",
_ => "Hi! Who is this again?"
}
}
fn main() {
let mut contacts = HashMap::new();
contacts.insert("Daniel", "798-1364");
contacts.insert("Ashley", "645-7689");
contacts.insert("Katie", "435-8291");
contacts.insert("Robert", "956-1745");
// Приймає посилання і повертає Option<&V>
match contacts.get(&"Daniel") {
Some(&number) => println!("Calling Daniel: {}", call(number)),
_ => println!("Don't have Daniel's number."),
}
// `HashMap::insert()` повертає `None`
// якщо вставлене значення нове, `Some(value)` в іншому разі
contacts.insert("Daniel", "164-6743");
match contacts.get(&"Ashley") {
Some(&number) => println!("Calling Ashley: {}", call(number)),
_ => println!("Don't have Ashley's number."),
}
contacts.remove(&"Ashley");
// `HashMap::iter()` повертає ітератор, який видає
// пари (&'a key, &'a value) у довільному порядку.
for (contact, &number) in contacts.iter() {
println!("Calling {}: {}", contact, call(number));
}
}
Докладніше про те, як працюють хешування та хеш-мапи (інколи звані хеш-таблицями), дивіться Вікіпедія про хеш-таблиці