Implementation of a hash set using the hopscotch hashing algorithm.
The Key must be either nothrow move-constructible, copy-constuctible 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 set grows and consequently how a hash value is mapped to a bucket. By default the set uses tsl::power_of_two_growth_policy. This policy keeps the number of buckets to a power of two and uses a mask to set 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 destructor of Key throws an exception, behaviour of the class is undefined.
Iterators invalidation:
Definition at line 78 of file hopscotch_set.h.
#include <hopscotch_set.h>
Data Structures | |
class | KeySelect |
Public Types | |
using | key_type = typename ht::key_type |
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 | |
hopscotch_set (size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator()) | |
hopscotch_set (size_type bucket_count, const Allocator &alloc) | |
hopscotch_set (size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
hopscotch_set (const Allocator &alloc) | |
template<class InputIt > | |
hopscotch_set (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_set (InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc) | |
template<class InputIt > | |
hopscotch_set (InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
hopscotch_set (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_set (std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc) | |
hopscotch_set (std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
hopscotch_set & | 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) |
std::pair< iterator, bool > | insert (value_type &&value) |
iterator | insert (const_iterator hint, const value_type &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... Args> | |
std::pair< iterator, bool > | emplace (Args &&... args) |
template<class... Args> | |
iterator | emplace_hint (const_iterator hint, 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_set &other) |
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) |
size_type | overflow_size () const noexcept |
Private Types | |
template<typename U > | |
using | has_is_transparent = tsl::detail_hopscotch_hash::has_is_transparent< U > |
using | overflow_container_type = std::list< Key, Allocator > |
using | ht = detail_hopscotch_hash::hopscotch_hash< Key, KeySelect, void, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy, overflow_container_type > |
Private Attributes | |
ht | m_ht |
Friends | |
bool | operator== (const hopscotch_set &lhs, const hopscotch_set &rhs) |
bool | operator!= (const hopscotch_set &lhs, const hopscotch_set &rhs) |
void | swap (hopscotch_set &lhs, hopscotch_set &rhs) |
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::allocator_type = typename ht::allocator_type |
Definition at line 111 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_iterator = typename ht::const_iterator |
Definition at line 117 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_pointer = typename ht::const_pointer |
Definition at line 115 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_reference = typename ht::const_reference |
Definition at line 113 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::difference_type = typename ht::difference_type |
Definition at line 108 of file hopscotch_set.h.
|
private |
Definition at line 81 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::hasher = typename ht::hasher |
Definition at line 109 of file hopscotch_set.h.
|
private |
Definition at line 98 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::iterator = typename ht::iterator |
Definition at line 116 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_equal = typename ht::key_equal |
Definition at line 110 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_type = typename ht::key_type |
Definition at line 105 of file hopscotch_set.h.
|
private |
Definition at line 97 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::pointer = typename ht::pointer |
Definition at line 114 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::reference = typename ht::reference |
Definition at line 112 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::size_type = typename ht::size_type |
Definition at line 107 of file hopscotch_set.h.
using tsl::hopscotch_set< Key, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::value_type = typename ht::value_type |
Definition at line 106 of file hopscotch_set.h.
|
inline |
Definition at line 123 of file hopscotch_set.h.
|
inlineexplicit |
Definition at line 126 of file hopscotch_set.h.
|
inline |
Definition at line 134 of file hopscotch_set.h.
|
inline |
Definition at line 139 of file hopscotch_set.h.
|
inlineexplicit |
Definition at line 145 of file hopscotch_set.h.
|
inline |
Definition at line 149 of file hopscotch_set.h.
|
inline |
Definition at line 159 of file hopscotch_set.h.
|
inline |
Definition at line 166 of file hopscotch_set.h.
|
inline |
Definition at line 173 of file hopscotch_set.h.
|
inline |
Definition at line 182 of file hopscotch_set.h.
|
inline |
Definition at line 189 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 214 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 213 of file hopscotch_set.h.
|
inline |
Definition at line 449 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 215 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 219 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 232 of file hopscotch_set.h.
|
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.
Definition at line 329 of file hopscotch_set.h.
|
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). Usefull to speed-up the lookup if you already have the hash.
Definition at line 338 of file hopscotch_set.h.
|
inline |
Definition at line 316 of file hopscotch_set.h.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Usefull to speed-up the lookup if you already have the hash.
Definition at line 322 of file hopscotch_set.h.
|
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.
Definition at line 257 of file hopscotch_set.h.
|
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.
Definition at line 269 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 225 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 218 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 217 of file hopscotch_set.h.
|
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.
Definition at line 416 of file hopscotch_set.h.
|
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.
Definition at line 433 of file hopscotch_set.h.
|
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). Usefull to speed-up the lookup if you already have the hash.
Definition at line 425 of file hopscotch_set.h.
|
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). Usefull to speed-up the lookup if you already have the hash.
Definition at line 439 of file hopscotch_set.h.
|
inline |
Definition at line 392 of file hopscotch_set.h.
|
inline |
Definition at line 402 of file hopscotch_set.h.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Usefull to speed-up the lookup if you already have the hash.
Definition at line 398 of file hopscotch_set.h.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Usefull to speed-up the lookup if you already have the hash.
Definition at line 407 of file hopscotch_set.h.
|
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.
Definition at line 294 of file hopscotch_set.h.
|
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). Usefull to speed-up the lookup to the value if you already have the hash.
Definition at line 303 of file hopscotch_set.h.
|
inline |
Definition at line 279 of file hopscotch_set.h.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Usefull to speed-up the lookup to the value if you already have the hash.
Definition at line 285 of file hopscotch_set.h.
|
inline |
Definition at line 278 of file hopscotch_set.h.
|
inline |
Definition at line 277 of file hopscotch_set.h.
|
inline |
Definition at line 276 of file hopscotch_set.h.
|
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.
Definition at line 363 of file hopscotch_set.h.
|
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.
Definition at line 378 of file hopscotch_set.h.
|
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). Usefull to speed-up the lookup if you already have the hash.
Definition at line 372 of file hopscotch_set.h.
|
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). Usefull to speed-up the lookup if you already have the hash.
Definition at line 387 of file hopscotch_set.h.
|
inline |
Definition at line 343 of file hopscotch_set.h.
|
inline |
Definition at line 351 of file hopscotch_set.h.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Usefull to speed-up the lookup if you already have the hash.
Definition at line 349 of file hopscotch_set.h.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Usefull to speed-up the lookup if you already have the hash.
Definition at line 356 of file hopscotch_set.h.
|
inline |
Definition at line 207 of file hopscotch_set.h.
|
inline |
Definition at line 467 of file hopscotch_set.h.
|
inline |
Definition at line 237 of file hopscotch_set.h.
|
inline |
Definition at line 240 of file hopscotch_set.h.
|
inline |
Definition at line 241 of file hopscotch_set.h.
|
inline |
Definition at line 244 of file hopscotch_set.h.
|
inline |
Definition at line 245 of file hopscotch_set.h.
|
inline |
Definition at line 238 of file hopscotch_set.h.
|
inline |
Definition at line 468 of file hopscotch_set.h.
|
inline |
Definition at line 456 of file hopscotch_set.h.
|
inline |
Definition at line 450 of file hopscotch_set.h.
|
inline |
Definition at line 457 of file hopscotch_set.h.
|
inline |
Definition at line 458 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 227 of file hopscotch_set.h.
|
inline |
Convert a const_iterator to an iterator.
Definition at line 478 of file hopscotch_set.h.
|
inline |
Definition at line 198 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 482 of file hopscotch_set.h.
|
inline |
Definition at line 460 of file hopscotch_set.h.
|
inline |
Definition at line 461 of file hopscotch_set.h.
|
inlinenoexcept |
Definition at line 226 of file hopscotch_set.h.
|
inline |
Definition at line 310 of file hopscotch_set.h.
|
friend |
Definition at line 499 of file hopscotch_set.h.
|
friend |
Definition at line 484 of file hopscotch_set.h.
|
friend |
Definition at line 503 of file hopscotch_set.h.
|
private |
Definition at line 508 of file hopscotch_set.h.