sparse-map
|
#include <sparse_map.h>
Public Types | |
using | key_type = typename ht::key_type |
using | mapped_type = T |
using | value_type = typename ht::value_type |
using | size_type = typename ht::size_type |
using | difference_type = typename ht::difference_type |
using | hasher = typename ht::hasher |
using | key_equal = typename ht::key_equal |
using | allocator_type = typename ht::allocator_type |
using | reference = typename ht::reference |
using | const_reference = typename ht::const_reference |
using | pointer = typename ht::pointer |
using | const_pointer = typename ht::const_pointer |
using | iterator = typename ht::iterator |
using | const_iterator = typename ht::const_iterator |
Public Member Functions | |
sparse_map () | |
sparse_map (size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator()) | |
sparse_map (size_type bucket_count, const Allocator &alloc) | |
sparse_map (size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
sparse_map (const Allocator &alloc) | |
template<class InputIt > | |
sparse_map (InputIt first, InputIt last, size_type bucket_count=ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator()) | |
template<class InputIt > | |
sparse_map (InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc) | |
template<class InputIt > | |
sparse_map (InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
sparse_map (std::initializer_list< value_type > init, size_type bucket_count=ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator()) | |
sparse_map (std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc) | |
sparse_map (std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
sparse_map & | operator= (std::initializer_list< value_type > ilist) |
allocator_type | get_allocator () const |
iterator | begin () noexcept |
const_iterator | begin () const noexcept |
const_iterator | cbegin () const noexcept |
iterator | end () noexcept |
const_iterator | end () const noexcept |
const_iterator | cend () const noexcept |
bool | empty () const noexcept |
size_type | size () const noexcept |
size_type | max_size () const noexcept |
void | clear () noexcept |
std::pair< iterator, bool > | insert (const value_type &value) |
template<class P , typename std::enable_if< std::is_constructible< value_type, P &&>::value >::type * = nullptr> | |
std::pair< iterator, bool > | insert (P &&value) |
std::pair< iterator, bool > | insert (value_type &&value) |
iterator | insert (const_iterator hint, const value_type &value) |
template<class P , typename std::enable_if< std::is_constructible< value_type, P &&>::value >::type * = nullptr> | |
iterator | insert (const_iterator hint, P &&value) |
iterator | insert (const_iterator hint, value_type &&value) |
template<class InputIt > | |
void | insert (InputIt first, InputIt last) |
void | insert (std::initializer_list< value_type > ilist) |
template<class M > | |
std::pair< iterator, bool > | insert_or_assign (const key_type &k, M &&obj) |
template<class M > | |
std::pair< iterator, bool > | insert_or_assign (key_type &&k, M &&obj) |
template<class M > | |
iterator | insert_or_assign (const_iterator hint, const key_type &k, M &&obj) |
template<class M > | |
iterator | insert_or_assign (const_iterator hint, key_type &&k, M &&obj) |
template<class... Args> | |
std::pair< iterator, bool > | emplace (Args &&... args) |
template<class... Args> | |
iterator | emplace_hint (const_iterator hint, Args &&... args) |
template<class... Args> | |
std::pair< iterator, bool > | try_emplace (const key_type &k, Args &&... args) |
template<class... Args> | |
std::pair< iterator, bool > | try_emplace (key_type &&k, Args &&... args) |
template<class... Args> | |
iterator | try_emplace (const_iterator hint, const key_type &k, Args &&... args) |
template<class... Args> | |
iterator | try_emplace (const_iterator hint, key_type &&k, Args &&... args) |
iterator | erase (iterator pos) |
iterator | erase (const_iterator pos) |
iterator | erase (const_iterator first, const_iterator last) |
size_type | erase (const key_type &key) |
size_type | erase (const key_type &key, std::size_t precalculated_hash) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
size_type | erase (const K &key) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
size_type | erase (const K &key, std::size_t precalculated_hash) |
void | swap (sparse_map &other) |
T & | at (const Key &key) |
T & | at (const Key &key, std::size_t precalculated_hash) |
const T & | at (const Key &key) const |
const T & | at (const Key &key, std::size_t precalculated_hash) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
T & | at (const K &key) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
T & | at (const K &key, std::size_t precalculated_hash) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
const T & | at (const K &key) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
const T & | at (const K &key, std::size_t precalculated_hash) const |
T & | operator[] (const Key &key) |
T & | operator[] (Key &&key) |
size_type | count (const Key &key) const |
size_type | count (const Key &key, std::size_t precalculated_hash) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
size_type | count (const K &key) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
size_type | count (const K &key, std::size_t precalculated_hash) const |
iterator | find (const Key &key) |
iterator | find (const Key &key, std::size_t precalculated_hash) |
const_iterator | find (const Key &key) const |
const_iterator | find (const Key &key, std::size_t precalculated_hash) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
iterator | find (const K &key) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
iterator | find (const K &key, std::size_t precalculated_hash) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
const_iterator | find (const K &key) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
const_iterator | find (const K &key, std::size_t precalculated_hash) const |
std::pair< iterator, iterator > | equal_range (const Key &key) |
std::pair< iterator, iterator > | equal_range (const Key &key, std::size_t precalculated_hash) |
std::pair< const_iterator, const_iterator > | equal_range (const Key &key) const |
std::pair< const_iterator, const_iterator > | equal_range (const Key &key, std::size_t precalculated_hash) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
std::pair< iterator, iterator > | equal_range (const K &key) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
std::pair< iterator, iterator > | equal_range (const K &key, std::size_t precalculated_hash) |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
std::pair< const_iterator, const_iterator > | equal_range (const K &key) const |
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> | |
std::pair< const_iterator, const_iterator > | equal_range (const K &key, std::size_t precalculated_hash) const |
size_type | bucket_count () const |
size_type | max_bucket_count () const |
float | load_factor () const |
float | max_load_factor () const |
void | max_load_factor (float ml) |
void | rehash (size_type count) |
void | reserve (size_type count) |
hasher | hash_function () const |
key_equal | key_eq () const |
iterator | mutable_iterator (const_iterator pos) |
template<class Serializer > | |
void | serialize (Serializer &serializer) const |
Static Public Member Functions | |
template<class Deserializer > | |
static sparse_map | deserialize (Deserializer &deserializer, bool hash_compatible=false) |
Friends | |
bool | operator== (const sparse_map &lhs, const sparse_map &rhs) |
bool | operator!= (const sparse_map &lhs, const sparse_map &rhs) |
void | swap (sparse_map &lhs, sparse_map &rhs) |
Implementation of a sparse hash map using open-addressing with quadratic probing. The goal on the hash map is to be the most memory efficient possible, even at low load factor, while keeping reasonable performances.
GrowthPolicy
defines how the map grows and consequently how a hash value is mapped to a bucket. By default the map uses tsl::sh::power_of_two_growth_policy
. This policy keeps the number of buckets to a power of two and uses a mask to map the hash to a bucket instead of the slow modulo. Other growth policies are available and you may define your own growth policy, check tsl::sh::power_of_two_growth_policy
for the interface.
ExceptionSafety
defines the exception guarantee provided by the class. By default only the basic exception safety is guaranteed which mean that all resources used by the hash map will be freed (no memory leaks) but the hash map may end-up in an undefined state if an exception is thrown (undefined here means that some elements may be missing). This can ONLY happen on rehash (either on insert or if rehash
is called explicitly) and will occur if the Allocator can't allocate memory (std::bad_alloc
) or if the copy constructor (when a nothrow move constructor is not available) throws an exception. This can be avoided by calling reserve
beforehand. This basic guarantee is similar to the one of google::sparse_hash_map
and spp::sparse_hash_map
. It is possible to ask for the strong exception guarantee with tsl::sh::exception_safety::strong
, the drawback is that the map will be slower on rehashes and will also need more memory on rehashes.
Sparsity
defines how much the hash set will compromise between insertion speed and memory usage. A high sparsity means less memory usage but longer insertion times, and vice-versa for low sparsity. The default tsl::sh::sparsity::medium
sparsity offers a good compromise. It doesn't change the lookup speed.
Key
and T
must be nothrow move constructible and/or copy constructible.
If the destructor of Key
or T
throws an exception, the behaviour of the class is undefined.
Iterators invalidation:
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::allocator_type = typename ht::allocator_type |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::const_iterator = typename ht::const_iterator |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::const_pointer = typename ht::const_pointer |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::const_reference = typename ht::const_reference |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::difference_type = typename ht::difference_type |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::hasher = typename ht::hasher |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::iterator = typename ht::iterator |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::key_equal = typename ht::key_equal |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::key_type = typename ht::key_type |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::mapped_type = T |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::pointer = typename ht::pointer |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::reference = typename ht::reference |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::size_type = typename ht::size_type |
using tsl::sparse_map< Key, T, Hash, KeyEqual, Allocator, GrowthPolicy, ExceptionSafety, Sparsity >::value_type = typename ht::value_type |
|
inline |
|
inlineexplicit |
|
inline |
|
inline |
|
inlineexplicit |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inlinestatic |
Deserialize a previouly serialized map through the deserializer
parameter.
The deserializer
parameter must be a function object that supports the following calls:
template<typename U> U operator()();
where the types std::uint64_t
, float
and std::pair<Key, T>
must be supported for U.If the deserialized hash map type is hash compatible with the serialized map, the deserialization process can be sped up by setting hash_compatible
to true. To be hash compatible, the Hash, KeyEqual and GrowthPolicy must behave the same way than the ones used on the serialized map. The std::size_t
must also be of the same size as the one on the platform used to serialize the map. If these criteria are not met, the behaviour is undefined with hash_compatible
sets to true, .
The behaviour is undefined if the type Key
and T
of the sparse_map
are not the same as the types used during serialization.
The implementation leaves binary compatibilty (endianness, IEEE 754 for floats, size of int, ...) of the types it deserializes in the hands of the Deserializer
function object if compatibilty is required.
|
inline |
Due to the way elements are stored, emplace will need to move or copy the key-value once. The method is equivalent to insert(value_type(std::forward<Args>(args)...));
.
Mainly here for compatibility with the std::unordered_map
interface.
|
inline |
Due to the way elements are stored, emplace_hint will need to move or copy the key-value once. The method is equivalent to insert(hint, value_type(std::forward<Args>(args)...));
.
Mainly here for compatibility with the std::unordered_map
interface.
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent
exists. If so, K
must be hashable and comparable to Key
.
Use the hash value precalculated_hash
instead of hashing the key. The hash value should be the same as hash_function()(key)
, otherwise the behaviour is undefined. Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinenoexcept |
|
inline |
Convert a const_iterator
to an iterator
.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Serialize the map through the serializer
parameter.
The serializer
parameter must be a function object that supports the following call:
void operator()(const U& value);
where the types std::uint64_t
, float
and std::pair<Key, T>
must be supported for U.The implementation leaves binary compatibilty (endianness, IEEE 754 for floats, ...) of the types it serializes in the hands of the Serializer
function object if compatibilty is required.
|
inlinenoexcept |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
friend |
|
friend |
|
friend |