Expand description
A variant of the indexmap
crate that amortizes the cost of resizes.
IndexMap
is a hash table where the iteration order of the key-value
pairs is independent of the hash values of the keys.
IndexSet
is a corresponding hash set using the same implementation and
with similar properties.
§Amortization
This crate is an ongoing fork of indexmap
that amortizes the cost of resizes.
If you’re unsure if you need this, take a look at the documentation of griddle
and atone
, which provide the underlying amortization.
§Feature Highlights
IndexMap
and IndexSet
are drop-in compatible with the std HashMap
and HashSet
, but they also have some features of note:
- The ordering semantics (see their documentation for details)
- Sorting methods and the
.pop()
methods. - The
Equivalent
trait, which offers more flexible equality definitions between borrowed and owned versions of keys. - The
MutableKeys
trait, which gives opt-in mutable access to hash map keys.
§Alternate Hashers
IndexMap
and IndexSet
have a default hasher type S = RandomState
,
just like the standard HashMap
and HashSet
, which is resistant to
HashDoS attacks but not the most performant. Type aliases can make it easier
to use alternate hashers:
use fnv::FnvBuildHasher;
use fxhash::FxBuildHasher;
use indexmap_amortized::{IndexMap, IndexSet};
type FnvIndexMap<K, V> = IndexMap<K, V, FnvBuildHasher>;
type FnvIndexSet<T> = IndexSet<T, FnvBuildHasher>;
type FxIndexMap<K, V> = IndexMap<K, V, FxBuildHasher>;
type FxIndexSet<T> = IndexSet<T, FxBuildHasher>;
let std: IndexSet<i32> = (0..100).collect();
let fnv: FnvIndexSet<i32> = (0..100).collect();
let fx: FxIndexSet<i32> = (0..100).collect();
assert_eq!(std, fnv);
assert_eq!(std, fx);
§Rust Version
This version of indexmap requires Rust 1.48 or later. This version of indexmap requires Rust 1.48+.
The indexmap 1.x release series will use a carefully considered version upgrade policy, where in a later 1.x version, we will raise the minimum required Rust version.
§No Standard Library Targets
This crate supports being built without std
, requiring
alloc
instead. This is enabled automatically when it is detected that
std
is not available. There is no crate feature to enable/disable to
trigger this. It can be tested by building for a std-less target.
- Creating maps and sets using
new
andwith_capacity
is unavailable withoutstd
.
Use methodsIndexMap::default
,with_hasher
,with_capacity_and_hasher
instead. A no-std compatible hasher will be needed as well, for example from the cratetwox-hash
. - Macros
indexmap!
andindexset!
are unavailable withoutstd
.
Re-exports§
Modules§
IndexMap
is a hash table where the iteration order of the key-value pairs is independent of the hash values of the keys.- Functions to serialize and deserialize an
IndexMap
as an ordered sequence. - A hash set implemented using
IndexMap
Macros§
- Create an
IndexMap
from a list of key-value pairs - Create an
IndexSet
from a list of values
Traits§
- Key equivalence trait.