|
| hopscotch_map () |
|
| hopscotch_map (size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator()) |
|
| hopscotch_map (size_type bucket_count, const Allocator &alloc) |
|
| hopscotch_map (size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
| hopscotch_map (const Allocator &alloc) |
|
template<class InputIt > |
| hopscotch_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 > |
| hopscotch_map (InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc) |
|
template<class InputIt > |
| hopscotch_map (InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
| hopscotch_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()) |
|
| hopscotch_map (std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc) |
|
| hopscotch_map (std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
hopscotch_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 (hopscotch_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 | 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) |
|
size_type | overflow_size () const noexcept |
|
template<class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = std::allocator<std::pair<Key, T>>, unsigned int NeighborhoodSize = 62, bool StoreHash = false, class GrowthPolicy = tsl::hh::power_of_two_growth_policy<2>>
class tsl::hopscotch_map< Key, T, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >
Implementation of a hash map using the hopscotch hashing algorithm.
The Key and the value T must be either nothrow move-constructible, copy-constructible or both.
The size of the neighborhood (NeighborhoodSize) must be > 0 and <= 62 if StoreHash is false. When StoreHash is true, 32-bits of the hash will be stored alongside the neighborhood limiting the NeighborhoodSize to <= 30. There is no memory usage difference between 'NeighborhoodSize 62; StoreHash false' and 'NeighborhoodSize 30; StoreHash true'.
Storing the hash may improve performance on insert during the rehash process if the hash takes time to compute. It may also improve read performance if the KeyEqual function takes time (or incurs a cache-miss). If used with simple Hash and KeyEqual it may slow things down.
StoreHash can only be set if the GrowthPolicy is set to tsl::power_of_two_growth_policy.
GrowthPolicy defines how the map grows and consequently how a hash value is mapped to a bucket. By default the map uses tsl::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. You may define your own growth policy, check tsl::power_of_two_growth_policy for the interface.
If the destructors of Key or T throw an exception, 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 if a displacement is needed to resolve a collision (which mean that most of the time, insert will invalidate the iterators). Or if there is a rehash.
- erase: iterator on the erased element is the only one which become invalid.