해시맵
벡터가 정수 인덱스로 값을 저장하는 반면, HashMap은 키(key)로 값을 저장합니다. HashMap의 키는 불리언, 정수, 문자열 또는 Eq와 Hash 트레이트를 구현하는 임의의 다른 타입이 될 수 있습니다. 이에 대해서는 다음 섹션에서 자세히 다룹니다.
벡터와 마찬가지로 HashMap은 늘어날 수 있지만, 공간이 남을 때는 스스로 줄어들 수도 있습니다. HashMap::with_capacity(uint)를 사용하여 특정 시작 용량으로 HashMap을 생성하거나, HashMap::new()를 사용하여 기본 초기 용량을 가진 HashMap을 얻을 수 있습니다(권장됨).
use std::collections::HashMap;
fn call(number: &str) -> &str {
match number {
"798-1364" => "죄송합니다, 전화 연결을 할 수 없습니다.
전화를 끊고 다시 시도해 주세요.",
"645-7689" => "안녕하세요, 어썸 피자입니다. 저는 프레드라고 합니다.
오늘 무엇을 도와드릴까요?",
_ => "안녕! 누구시더라?"
}
}
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의 해시 테이블을 참조하세요.