[][src]Crate defaultmap

It can be useful to not have to worry about missing keys in a map. If a key is requested that doesn't have a value a default value is simply returned. This is exactly what this library provides.



A clear use case of this is when counting the unique elements in a list. Here you want to add one to the existing value in the map for that key. This is a problem for the first addition when there's no value for the key yet. With this library you can specify when creating the map that the default value should be zero.

let nums = [1, 4, 3, 3, 4, 2, 4];
let mut counts: DefaultHashMap<i32, i32> = defaulthashmap!();
// DefaultHashMap::new(0) is equivalent.

for num in nums.into_iter() {
    counts[*num] += 1;

println!("{:?}", counts);
// DefaultHashMap { map: {1: 1, 3: 2, 2: 1, 4: 3}, default: 0 }

Synonym lists

Another way the default map can be used is using a map filled with other collections, such as a Vec, a HashMap or even another default map. Next follows some code to create a map where we start with tuples of synonyms and we end with a map that contains the list of synonyms for each word.

let synonym_tuples = [
    ("nice", "sweet"),
    ("sweet", "candy"),
    ("nice", "entertaining"),
    ("nice", "good"),
    ("entertaining", "absorbing"),

let mut synonym_map: DefaultHashMap<&str, Vec<&str>> = defaulthashmap!();
// DefaultHashMap::new(vec![]) is equivalent.

for &(l, r) in synonym_tuples.into_iter() {

assert_eq!(synonym_map["good"], vec!["nice"]);
assert_eq!(synonym_map["nice"], vec!["sweet", "entertaining", "good"]);
assert_eq!(synonym_map["evil"], Vec::<&str>::new());



The defaulthashmap! macro can be used to easily initialize a DefaultHashMap in the following ways:



A HashMap that returns a default when keys are accessed that are not present.