IOSS 2.0
|
#include <bhopscotch_map.h>
Classes | |
class | KeySelect |
class | ValueSelect |
Public Types | |
using | key_type = typename ht::key_type |
using | mapped_type = T |
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 | |
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 |
Private Types | |
template<typename U> | |
using | has_is_transparent = tsl::detail_hopscotch_hash::has_is_transparent<U> |
using | overflow_container_type = std::map<Key, T, Compare, Allocator> |
using | ht |
Private Attributes | |
ht | m_ht |
Friends | |
bool | operator== (const bhopscotch_map &lhs, const bhopscotch_map &rhs) |
bool | operator!= (const bhopscotch_map &lhs, const bhopscotch_map &rhs) |
void | swap (bhopscotch_map &lhs, bhopscotch_map &rhs) |
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).
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::allocator_type = typename ht::allocator_type |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_iterator = typename ht::const_iterator |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_pointer = typename ht::const_pointer |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::const_reference = typename ht::const_reference |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::difference_type = typename ht::difference_type |
|
private |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::hasher = typename ht::hasher |
|
private |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::iterator = typename ht::iterator |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_compare = Compare |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_equal = typename ht::key_equal |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::key_type = typename ht::key_type |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::mapped_type = T |
|
private |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::pointer = typename ht::pointer |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::reference = typename ht::reference |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::size_type = typename ht::size_type |
using tsl::bhopscotch_map< Key, T, Hash, KeyEqual, Compare, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy >::value_type = typename ht::value_type |
|
inline |
|
inlineexplicit |
|
inline |
|
inline |
|
inlineexplicit |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
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.
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
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.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
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.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
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.
|
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.
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
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.
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
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.
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup to the value if you already have the hash.
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup to the value if you already have the hash.
|
inline |
|
inline |
|
inline |
|
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.
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
|
inline |
|
inline |
Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same as hash_function()(key). Useful to speed-up the lookup if you already have the hash.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinenoexcept |
|
inline |
Convert a const_iterator to an iterator.
|
inline |
|
inline |
|
inline |
|
inlinenoexcept |
|
inline |
|
inline |
|
inlinenoexcept |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
friend |
|
friend |
|
friend |
|
private |