69 lines
2.2 KiB
Markdown
69 lines
2.2 KiB
Markdown
|
# sortedvec
|
||
|
|
||
|
[![Build Status](https://dev.azure.com/marcusklaas/sortedvec/_apis/build/status/marcusklaas.sortedvec?branchName=master)](https://dev.azure.com/marcusklaas/sortedvec/_build/latest?definitionId=2&branchName=master)
|
||
|
[![Docs](https://docs.rs/sortedvec/badge.svg)](https://docs.rs/sortedvec)
|
||
|
[![Crates.io](https://img.shields.io/crates/v/sortedvec.svg?maxAge=2592000)](https://crates.io/crates/sortedvec)
|
||
|
|
||
|
[Documentation](https://docs.rs/sortedvec/)
|
||
|
|
||
|
A pure rust library that exposes macros that generate data structures
|
||
|
on `Ord` keys that enables quicker lookups than regular `Vec`s (`O(log(n))` vs `O(n)`)
|
||
|
and is simpler and more memory efficient than hashmaps. It is ideal for small
|
||
|
lookup tables where insertions and deletions are infrequent.
|
||
|
|
||
|
**Note**: `sortedvec` is still highly experimental and likely to change significantly.
|
||
|
|
||
|
## Example
|
||
|
|
||
|
```rust
|
||
|
use sortedvec::sortedvec;
|
||
|
|
||
|
sortedvec! {
|
||
|
struct SortedVec {
|
||
|
fn derive_key(x: &u32) -> u32 { *x }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let unsorted = vec![3, 5, 0, 10, 7, 1];
|
||
|
let sorted = SortedVec::from(unsorted.clone());
|
||
|
|
||
|
// linear search (slow!)
|
||
|
let unsorted_contains_six: Option<_> = unsorted.iter().find(|&x| *x == 6);
|
||
|
assert!(unsorted_contains_six.is_none());
|
||
|
|
||
|
// binary search (fast!)
|
||
|
let sorted_contains_six: Option<_> = sorted.find(&6);
|
||
|
assert!(sorted_contains_six.is_none());
|
||
|
```
|
||
|
|
||
|
## Benchmarks
|
||
|
|
||
|
The table below displays how lookups scale on the standard library's `HashMap`,
|
||
|
`SortedVec` and `Vec` for string and integer keys.
|
||
|
|
||
|
| key type | size | `HashMap` | `SortedVec` | `Vec` |
|
||
|
|---|---:|---:|---:|---:|
|
||
|
| int | 2 | 17 | 2 | 2 |
|
||
|
| int | 6 | 17 | 3 | 2 |
|
||
|
| int | 10 | 18 | 4 | 3 |
|
||
|
| int | 50 | 19 | 5 | 15 |
|
||
|
| int | 100 | 23 | 6 | 28 |
|
||
|
| int | 500 | 18 | 8 | 127 |
|
||
|
| int |1000 | 17 | 8 | 231 |
|
||
|
| string | 2 | 25 | 10 | 5 |
|
||
|
| string | 6 | 25 | 20 | 12 |
|
||
|
| string | 10 | 27 | 25 | 21 |
|
||
|
| string | 50 | 30 | 36 | 113 |
|
||
|
| string | 100 | 27 | 42 | 232 |
|
||
|
| string | 500 | 26 | 53 | 1,207 |
|
||
|
| string |1000 | 26 | 59 | 2,324 |
|
||
|
|
||
|
## Change log
|
||
|
|
||
|
- **5.0**:
|
||
|
* Introduction of the `sortedvec_slicekey!` macro.
|
||
|
* Resolved key derivation function naming collisions by associating them to the data structure.
|
||
|
This fixes the key derivation names to `derive_key`. This is a *breaking change*.
|
||
|
- **4.1**: First public release.
|
||
|
|