11 unstable releases

0.6.0 Aug 23, 2023
0.5.0 Sep 10, 2020
0.4.0 May 25, 2019
0.3.1 Jun 14, 2018
0.3.0 Jul 29, 2017

#840 in Data structures

Download history 1457/week @ 2024-06-07 1106/week @ 2024-06-14 1511/week @ 2024-06-21 1168/week @ 2024-06-28 1274/week @ 2024-07-05 1396/week @ 2024-07-12 1677/week @ 2024-07-19 3539/week @ 2024-07-26 2287/week @ 2024-08-02 2455/week @ 2024-08-09 1705/week @ 2024-08-16 1260/week @ 2024-08-23 1706/week @ 2024-08-30 1081/week @ 2024-09-06 1807/week @ 2024-09-13 1425/week @ 2024-09-20

6,334 downloads per month
Used in 5 crates

MIT license

46KB
950 lines

defaultmap

Build Status codecov Latest Version Rust Documentation GitHub license

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.

Examples

Counter

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.

# use defaultmap::*;
let nums = [1, 4, 3, 3, 4, 2, 4];
let mut counts:  DefaultHashMap<i32, i32> = DefaultHashMap::new(0);
// DefaultHashMap::default() 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 }

# assert_eq!(1, counts[1]);
# assert_eq!(1, counts[2]);
# assert_eq!(2, counts[3]);
# assert_eq!(3, counts[4]);

Synonym lists

Another way the default map can be used is using a map filled with other collections, such as a 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.

# use defaultmap::*;

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

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

for &(l, r) in synonym_tuples.into_iter() {
    synonym_map[l].push(r);
    synonym_map[r].push(l);
}

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

Dependencies

~0.4–1MB
~21K SLoC