# slabmap
[](https://crates.io/crates/slabmap)
[](https://docs.rs/slabmap/)
[](https://github.com/frozenlib/slabmap/actions)
This crate provides the type `SlabMap`.
`SlabMap` is HashMap-like collection that automatically determines the key.
## Install
Add this to your Cargo.toml:
```toml
[dependencies]
slabmap = "0.2.0"
```
## Examples
```rust
use slabmap::SlabMap;
let mut s = SlabMap::new();
let key_a = s.insert("aaa");
let key_b = s.insert("bbb");
assert_eq!(s[key_a], "aaa");
assert_eq!(s[key_b], "bbb");
for (key, value) in &s {
println!("{} -> {}", key, value);
}
assert_eq!(s.remove(key_a), Some("aaa"));
assert_eq!(s.remove(key_a), None);
```
## The difference between `SlabMap` and [`HashMap`](https://doc.rust-lang.org/std/collections/struct.HashMap.html)
- `SlabMap` can only use usize as a key.
- The key of `SlabMap` is determined automatically.
- `SlabMap` runs faster than `HashMap`.
## The difference between `SlabMap` and [`Slab`](https://docs.rs/slab/0.4.2/slab/struct.Slab.html)
Carl Lerche's [`slab`](https://crates.io/crates/slab) crate provides a slab implementation with a similar API.
For both `Slab` and `SlabMap`, after adding many elements to the collection, removing many element will reduce iterate performance.
However, unlike `Slab`, `SlabMap` can improve iterate performance by calling [`SlabMap::optimize()`](https://docs.rs/slabmap/latest/slabmap/struct.SlabMap.html#method.optimize).
## Performance
The following chart shows the difference in performance between
[`BTreeMap`](https://doc.rust-lang.org/std/collections/struct.BTreeMap.html),
[`HashMap`](https://doc.rust-lang.org/std/collections/struct.HashMap.html),
[`Slab`](https://docs.rs/slab/0.4.2/slab/struct.Slab.html)(version 0.4.2),
`SlabMap`(version 0.1.0) and,
[`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html),
### Insert

### Remove random elements

### Random access

### Sequential access

### Sequential access after removing elements from a 10,000-element collection
- x-axis : number of remaining elements
- y-axis : average time (lower is better)

## License
This project is dual licensed under Apache-2.0/MIT. See the two LICENSE-\* files for details.
## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.