Similar to tsl::hopscotch_set but instead of using a list for overflowing elements it uses a binary search tree. It thus needs an additional template parameter Compare. Compare should be arithmetically coherent with KeyEqual.
The binary search tree allows the set to have a worst-case scenario of O(log n) for search and delete, even if the hash function maps all the elements to the same bucket. For insert, the amortized worst case is O(log n), but the worst case is O(n) in case of rehash.
This makes the set resistant to DoS attacks (but doesn't preclude you to have a good hash function, as an element in the bucket array is faster to retrieve than in the tree).
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 64 of file hopscotch_sc_set.h.
#include <hopscotch_sc_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 | key_compare = Compare |
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_sc_set (size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator(), const Compare &comp=Compare()) | |
hopscotch_sc_set (size_type bucket_count, const Allocator &alloc) | |
hopscotch_sc_set (size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
hopscotch_sc_set (const Allocator &alloc) | |
template<class InputIt > | |
hopscotch_sc_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_sc_set (InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc) | |
template<class InputIt > | |
hopscotch_sc_set (InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
hopscotch_sc_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_sc_set (std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc) | |
hopscotch_sc_set (std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc) | |
hopscotch_sc_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, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
size_type | erase (const K &key) |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
size_type | erase (const K &key, std::size_t precalculated_hash) |
void | swap (hopscotch_sc_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, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
size_type | count (const K &key) const |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::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, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
iterator | find (const K &key) |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
iterator | find (const K &key, std::size_t precalculated_hash) |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
const_iterator | find (const K &key) const |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::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, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
std::pair< iterator, iterator > | equal_range (const K &key) |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
std::pair< iterator, iterator > | equal_range (const K &key, std::size_t precalculated_hash) |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> | |
std::pair< const_iterator, const_iterator > | equal_range (const K &key) const |
template<class K , class KE = KeyEqual, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::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 |
key_compare | key_comp () 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::set< Key, Compare, Allocator > |
using | ht = tsl::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_sc_set &lhs, const hopscotch_sc_set &rhs) |
bool | operator!= (const hopscotch_sc_set &lhs, const hopscotch_sc_set &rhs) |
void | swap (hopscotch_sc_set &lhs, hopscotch_sc_set &rhs) |
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::allocator_type = typename ht::allocator_type |
Definition at line 98 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_iterator = typename ht::const_iterator |
Definition at line 104 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_pointer = typename ht::const_pointer |
Definition at line 102 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_reference = typename ht::const_reference |
Definition at line 100 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::difference_type = typename ht::difference_type |
Definition at line 94 of file hopscotch_sc_set.h.
|
private |
Definition at line 67 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::hasher = typename ht::hasher |
Definition at line 95 of file hopscotch_sc_set.h.
|
private |
Definition at line 84 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::iterator = typename ht::iterator |
Definition at line 103 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_compare = Compare |
Definition at line 97 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_equal = typename ht::key_equal |
Definition at line 96 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_type = typename ht::key_type |
Definition at line 91 of file hopscotch_sc_set.h.
|
private |
Definition at line 83 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::pointer = typename ht::pointer |
Definition at line 101 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::reference = typename ht::reference |
Definition at line 99 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::size_type = typename ht::size_type |
Definition at line 93 of file hopscotch_sc_set.h.
using tsl::hopscotch_sc_set< Key, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::value_type = typename ht::value_type |
Definition at line 92 of file hopscotch_sc_set.h.
|
inline |
Definition at line 110 of file hopscotch_sc_set.h.
|
inlineexplicit |
Definition at line 113 of file hopscotch_sc_set.h.
|
inline |
Definition at line 122 of file hopscotch_sc_set.h.
|
inline |
Definition at line 127 of file hopscotch_sc_set.h.
|
inlineexplicit |
Definition at line 133 of file hopscotch_sc_set.h.
|
inline |
Definition at line 137 of file hopscotch_sc_set.h.
|
inline |
Definition at line 147 of file hopscotch_sc_set.h.
|
inline |
Definition at line 154 of file hopscotch_sc_set.h.
|
inline |
Definition at line 161 of file hopscotch_sc_set.h.
|
inline |
Definition at line 170 of file hopscotch_sc_set.h.
|
inline |
Definition at line 177 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 202 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 201 of file hopscotch_sc_set.h.
|
inline |
Definition at line 451 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 203 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 207 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 220 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. If so, K must be hashable and comparable to Key.
Definition at line 320 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. 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 330 of file hopscotch_sc_set.h.
|
inline |
Definition at line 305 of file hopscotch_sc_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 311 of file hopscotch_sc_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 245 of file hopscotch_sc_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 257 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 213 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 206 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 205 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. If so, K must be hashable and comparable to Key.
Definition at line 415 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. If so, K must be hashable and comparable to Key.
Definition at line 434 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. 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_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. 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 441 of file hopscotch_sc_set.h.
|
inline |
Definition at line 389 of file hopscotch_sc_set.h.
|
inline |
Definition at line 399 of file hopscotch_sc_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 395 of file hopscotch_sc_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 404 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. If so, K must be hashable and comparable to Key.
Definition at line 284 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. 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 294 of file hopscotch_sc_set.h.
|
inline |
Definition at line 267 of file hopscotch_sc_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 273 of file hopscotch_sc_set.h.
|
inline |
Definition at line 266 of file hopscotch_sc_set.h.
|
inline |
Definition at line 265 of file hopscotch_sc_set.h.
|
inline |
Definition at line 264 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. If so, K must be hashable and comparable to Key.
Definition at line 357 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. If so, K must be hashable and comparable to Key.
Definition at line 374 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. 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 367 of file hopscotch_sc_set.h.
|
inline |
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent and Compare::is_transparent exist. 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 384 of file hopscotch_sc_set.h.
|
inline |
Definition at line 335 of file hopscotch_sc_set.h.
|
inline |
Definition at line 343 of file hopscotch_sc_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 341 of file hopscotch_sc_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 348 of file hopscotch_sc_set.h.
|
inline |
Definition at line 195 of file hopscotch_sc_set.h.
|
inline |
Definition at line 469 of file hopscotch_sc_set.h.
|
inline |
Definition at line 225 of file hopscotch_sc_set.h.
|
inline |
Definition at line 228 of file hopscotch_sc_set.h.
|
inline |
Definition at line 229 of file hopscotch_sc_set.h.
|
inline |
Definition at line 232 of file hopscotch_sc_set.h.
|
inline |
Definition at line 233 of file hopscotch_sc_set.h.
|
inline |
Definition at line 226 of file hopscotch_sc_set.h.
|
inline |
Definition at line 471 of file hopscotch_sc_set.h.
|
inline |
Definition at line 470 of file hopscotch_sc_set.h.
|
inline |
Definition at line 458 of file hopscotch_sc_set.h.
|
inline |
Definition at line 452 of file hopscotch_sc_set.h.
|
inline |
Definition at line 459 of file hopscotch_sc_set.h.
|
inline |
Definition at line 460 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 215 of file hopscotch_sc_set.h.
|
inline |
Convert a const_iterator to an iterator.
Definition at line 481 of file hopscotch_sc_set.h.
|
inline |
Definition at line 186 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 485 of file hopscotch_sc_set.h.
|
inline |
Definition at line 462 of file hopscotch_sc_set.h.
|
inline |
Definition at line 463 of file hopscotch_sc_set.h.
|
inlinenoexcept |
Definition at line 214 of file hopscotch_sc_set.h.
|
inline |
Definition at line 299 of file hopscotch_sc_set.h.
|
friend |
Definition at line 502 of file hopscotch_sc_set.h.
|
friend |
Definition at line 487 of file hopscotch_sc_set.h.
|
friend |
Definition at line 506 of file hopscotch_sc_set.h.
|
private |
Definition at line 511 of file hopscotch_sc_set.h.