template<typename TKey, typename TMapped, typename THashFunc = HashCoder<TKey>, typename TEqualFunc = std::equal_to<TKey>, typename TAllocator = std::allocator<std::pair<const TKey, TMapped>>>
class momo::stdish::unordered_multimap_open< TKey, TMapped, THashFunc, TEqualFunc, TAllocator >
momo::stdish::unordered_multimap_open
is similar to std::unordered_multimap
, but much more efficient in operation speed. The implementation is based on open addressing hash table.
Deviations from the std::unordered_multimap
:
- Each of duplicate keys stored only once.
max_load_factor
, rehash
, reserve
, load_factor
and all the functions, associated with buckets or nodes, are not implemented.
- Container items must be movable (preferably without exceptions) or copyable, similar to items of
std::vector
.
- After each addition or removal of the item all iterators and references to items become invalid and should not be used.
- Type
reference
is not the same as value_type&
, so for (auto& p : map)
is illegal, but for (auto p : map)
or for (const auto& p : map)
or for (auto&& p : map)
is allowed.
- Functions
clear
, begin
, cbegin
and iterator increment take O(bucket_count) time in worst case.
- Functions
erase
can throw exceptions thrown by key_type
and mapped_type
move assignment operators.
It is allowed to pass to functions insert
and emplace
references to items within the container. But in case of the function insert
, receiving pair of iterators, it's not allowed to pass iterators pointing to the items within the container.