|
| bhopscotch_map () |
|
| bhopscotch_map (size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator(), const Compare &comp=Compare()) |
|
| bhopscotch_map (size_type bucket_count, const Allocator &alloc) |
|
| bhopscotch_map (size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
| bhopscotch_map (const Allocator &alloc) |
|
template<class InputIt > |
| bhopscotch_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 > |
| bhopscotch_map (InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc) |
|
template<class InputIt > |
| bhopscotch_map (InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
| bhopscotch_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()) |
|
| bhopscotch_map (std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc) |
|
| bhopscotch_map (std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc) |
|
bhopscotch_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, 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 (bhopscotch_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, class CP = Compare, typename std::enable_if< has_is_transparent< KE >::value &&has_is_transparent< CP >::value >::type * = nullptr> |
T & | at (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> |
T & | at (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 T & | at (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 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, 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 |
|
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, 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 |
|
template<class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Compare = std::less<Key>, class Allocator = std::allocator<std::pair<const Key, T>>, unsigned int NeighborhoodSize = 62, bool StoreHash = false, class GrowthPolicy = tsl::hh::power_of_two_growth_policy<2>>
class tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >
Similar to tsl::hopscotch_map 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 map 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 map 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).