|
| robin_map () |
|
| robin_map (size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator()) |
|
| robin_map (size_type bucket_count, const Allocator &alloc) |
|
| robin_map (size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
| robin_map (const Allocator &alloc) |
|
template<class InputIt > |
| robin_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 > |
| robin_map (InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc) |
|
template<class InputIt > |
| robin_map (InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
| robin_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()) |
|
| robin_map (std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc) |
|
| robin_map (std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
robin_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 (robin_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 |
|
bool | contains (const Key &key) const |
|
bool | contains (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> |
bool | contains (const K &key) const |
|
template<class K , class KE = KeyEqual, typename std::enable_if< has_is_transparent< KE >::value >::type * = nullptr> |
bool | contains (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 | min_load_factor () const |
|
float | max_load_factor () const |
|
void | min_load_factor (float ml) |
|
void | max_load_factor (float ml) |
|
void | rehash (size_type my_count) |
|
void | reserve (size_type my_count) |
|
hasher | hash_function () const |
|
key_equal | key_eq () const |
|
iterator | mutable_iterator (const_iterator pos) |
|
template<class Serializer > |
void | serialize (Serializer &serializer) const |
|
template<class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = std::allocator<std::pair<Key, T>>, bool StoreHash = false, class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>>
class tsl::robin_map< Key, T, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy >
Implementation of a hash map using open-addressing and the robin hood hashing algorithm with backward shift deletion.
For operations modifying the hash map (insert, erase, rehash, ...), the strong exception guarantee is only guaranteed when the expression std::is_nothrow_swappable<std::pair<Key, T>>\:\:value && std::is_nothrow_move_constructible<std::pair<Key, T>>\:\:value
is true, otherwise if an exception is thrown during the swap or the move, the hash map may end up in a undefined state. Per the standard a Key
or T
with a noexcept copy constructor and no move constructor also satisfies the std::is_nothrow_move_constructible<std::pair<Key, T>>\:\:value
criterion (and will thus guarantee the strong exception for the map).
When StoreHash
is true, 32 bits of the hash are stored alongside the values. It can improve the performance during lookups if the KeyEqual
function takes time (if it engenders a cache-miss for example) as we then compare the stored hashes before comparing the keys. When tsl::rh::power_of_two_growth_policy
is used as GrowthPolicy
, it may also speed-up the rehash process as we can avoid to recalculate the hash. When it is detected that storing the hash will not incur any memory penalty due to alignment (i.e. sizeof(tsl::detail_robin_hash::bucket_entry<ValueType, true>) == sizeof(tsl::detail_robin_hash::bucket_entry<ValueType, false>)
) and tsl::rh::power_of_two_growth_policy
is used, the hash will be stored even if StoreHash
is false so that we can speed-up the rehash (but it will not be used on lookups unless StoreHash
is true).
GrowthPolicy
defines how the map grows and consequently how a hash value is mapped to a bucket. By default the map uses tsl::rh::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::rh::power_of_two_growth_policy
for the interface.
std::pair<Key, T>
must be swappable.
Key
and T
must be copy and/or move constructible.
If the destructor of Key
or T
throws an exception, the behaviour of the class is undefined.
Iterators invalidation:
- clear, operator=, reserve, rehash: always invalidate the iterators.
- insert, emplace, emplace_hint, operator[]: if there is an effective insert, invalidate the iterators.
- erase: always invalidate the iterators.