1#ifndef NEFORCE_CORE_CONTAINER_FLAT_UNORDERED_MULTIMAP_HPP__
2#define NEFORCE_CORE_CONTAINER_FLAT_UNORDERED_MULTIMAP_HPP__
15NEFORCE_BEGIN_NAMESPACE__
39template <
typename Key,
typename T,
typename HashFcn = hash<Key>,
typename EqualKey = equal_to<Key>,
40 typename Alloc = allocator<pair<Key, T>>>
44 static_assert(
is_object_v<Key>,
"flat_unordered_multimap only contains object types.");
124 ht_(_NEFORCE
move(other.ht_)) {}
133 ht_ = _NEFORCE
move(other.ht_);
143 template <
typename Iterator>
146 ht_.insert_equal(first, last);
156 template <
typename Iterator>
159 ht_.insert_equal(first, last);
170 template <
typename Iterator>
173 ht_.insert_equal(first, last);
185 template <
typename Iterator>
188 ht_.insert_equal(first, last);
278 NEFORCE_NODISCARD
bool empty() const noexcept {
return ht_.empty(); }
292 return ht_.count(key);
300 NEFORCE_NODISCARD
bool contains(
const key_type& key)
const noexcept(
noexcept(ht_.contains(key))) {
301 return ht_.contains(key);
309 return ht_.hash_function();
322 NEFORCE_NODISCARD
float load_factor() const noexcept {
return ht_.load_factor(); }
328 NEFORCE_NODISCARD
float max_load_factor() const noexcept {
return ht_.max_load_factor(); }
356 template <
typename... Args>
381 template <
typename Iterator>
382 void insert(Iterator first, Iterator last) {
383 ht_.insert_equal(first, last);
390 void insert(std::initializer_list<value_type> ilist) { ht_.insert_equal(ilist); }
428 return ht_.erase(first, last);
434 void clear() noexcept { ht_.clear(); }
463 return ht_.equal_range(key);
478 return ht_ == rhs.ht_;
487 return ht_ < rhs.ht_;
491#ifdef NEFORCE_STANDARD_17
492template <
typename Iterator,
typename HashFcn = hash<iter_map_key_t<Iterator>>,
493 typename Compare = equal_to<iter_map_key_t<Iterator>>,
typename Alloc>
494flat_unordered_multimap(Iterator, Iterator, HashFcn = HashFcn(), Compare = Compare(), Alloc = Alloc())
495 -> flat_unordered_multimap<iter_map_key_t<Iterator>, iter_map_value_t<Iterator>, HashFcn, Compare, Alloc>;
497template <
typename Key,
typename T,
typename HashFcn = hash<Key>,
typename Compare = equal_to<Key>,
498 typename Alloc = allocator<pair<Key, T>>>
499flat_unordered_multimap(std::initializer_list<pair<Key, T>>, HashFcn = HashFcn(), Compare = Compare(), Alloc = Alloc())
500 -> flat_unordered_multimap<Key, T, HashFcn, Compare, Alloc>;
502template <
typename Iterator,
typename Alloc>
503flat_unordered_multimap(Iterator, Iterator, Alloc)
504 -> flat_unordered_multimap<iter_map_key_t<Iterator>, iter_map_value_t<Iterator>, hash<iter_map_key_t<Iterator>>,
505 equal_to<iter_map_key_t<Iterator>>, Alloc>;
507template <
typename Iterator,
typename HashFcn,
typename Alloc>
508flat_unordered_multimap(Iterator, Iterator, HashFcn, Alloc)
509 -> flat_unordered_multimap<iter_map_key_t<Iterator>, iter_map_value_t<Iterator>, HashFcn,
510 equal_to<iter_map_key_t<Iterator>>, Alloc>;
512template <
typename Key,
typename T,
typename Alloc>
513flat_unordered_multimap(std::initializer_list<pair<Key, T>>, Alloc)
514 -> flat_unordered_multimap<Key, T, hash<Key>, equal_to<Key>, Alloc>;
516template <
typename Key,
typename T,
typename HashFcn,
typename Alloc>
517flat_unordered_multimap(std::initializer_list<pair<Key, T>>, HashFcn, Alloc)
518 -> flat_unordered_multimap<Key, T, HashFcn, equal_to<Key>, Alloc>;
523NEFORCE_END_NAMESPACE__
flat_hashtable_iterator< true, flat_hashtable > const_iterator
ptrdiff_t difference_type
flat_hashtable_iterator< false, flat_hashtable > iterator
flat_unordered_multimap(std::initializer_list< value_type > ilist, const size_type n)
初始化列表构造函数,指定初始容量
flat_unordered_multimap()=default
默认构造函数
const_iterator cbegin() const noexcept
获取常量起始迭代器
typename base_type::const_iterator const_iterator
常量迭代器类型
flat_unordered_multimap(flat_unordered_multimap &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
void insert(Iterator first, Iterator last)
范围插入元素
void clear() noexcept
清空容器
iterator insert(value_type &&value)
移动插入元素
size_type max_size() const noexcept
获取最大可能大小
iterator erase(const iterator first, const iterator last) noexcept
删除指定范围内的元素
flat_unordered_multimap(Iterator first, Iterator last, const size_type n, const hasher &hf)
范围构造函数,指定初始容量和哈希函数
const_iterator end() const noexcept
获取常量结束迭代器
flat_unordered_multimap & operator=(flat_unordered_multimap &&other) noexcept(is_nothrow_move_assignable_v< base_type >)
移动赋值运算符
const_iterator erase(const const_iterator first, const const_iterator last) noexcept
删除指定范围内的常量元素
pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
iterator begin() noexcept
获取起始迭代器
size_type size() const noexcept
获取元素数量
const_iterator find(const key_type &key) const
查找具有指定键的常量元素
hasher hash_function() const noexcept(noexcept(ht_.hash_function()))
获取哈希函数对象
flat_unordered_multimap(Iterator first, Iterator last, const size_type n, const hasher &hf, const key_equal &eql)
范围构造函数,指定初始容量、哈希函数和键相等比较函数
bool contains(const key_type &key) const noexcept(noexcept(ht_.contains(key)))
检查是否包含指定键
flat_unordered_multimap(const flat_unordered_multimap &other)
拷贝构造函数
void insert(std::initializer_list< value_type > ilist)
初始化列表插入元素
iterator end() noexcept
获取结束迭代器
size_type capacity() const noexcept
获取容量
flat_unordered_multimap(std::initializer_list< value_type > ilist, const size_type n, const hasher &hf)
初始化列表构造函数,指定初始容量和哈希函数
typename base_type::key_type key_type
键类型
const_iterator begin() const noexcept
获取常量起始迭代器
iterator find(const key_type &key)
查找具有指定键的元素
flat_unordered_multimap(const size_type n, const hasher &hf, const key_equal &eql)
构造函数,指定初始容量、哈希函数和键相等比较函数
typename base_type::difference_type difference_type
差值类型
flat_unordered_multimap(Iterator first, Iterator last, const size_type n)
范围构造函数,指定初始容量
float load_factor() const noexcept
获取当前负载因子
float max_load_factor() const noexcept
获取最大负载因子
bool less_than(const flat_unordered_multimap &rhs) const noexcept(noexcept(ht_< rhs.ht_))
小于比较操作符
const_iterator erase(const const_iterator position) noexcept
删除指定位置的常量元素
iterator insert(const value_type &value)
插入元素(拷贝版本)
const value_type * const_pointer
常量指针类型
size_type erase(const key_type &key) noexcept
删除所有具有指定键的元素
value_type & reference
引用类型
size_type count(const key_type &key) const noexcept(noexcept(ht_.count(key)))
统计具有指定键的元素数量
flat_unordered_multimap(const size_type n, const hasher &hf)
构造函数,指定初始容量和哈希函数
flat_unordered_multimap(std::initializer_list< value_type > ilist)
初始化列表构造函数
void max_load_factor(const float lf) noexcept
设置最大负载因子
typename base_type::allocator_type allocator_type
分配器类型
typename base_type::iterator iterator
迭代器类型
flat_unordered_multimap & operator=(const flat_unordered_multimap &other)
拷贝赋值运算符
typename base_type::size_type size_type
大小类型
typename base_type::key_equal key_equal
键相等比较函数类型
key_equal key_eql() const noexcept(noexcept(ht_.key_eql()))
获取键相等比较函数对象
bool equal_to(const flat_unordered_multimap &rhs) const noexcept(noexcept(ht_==rhs.ht_))
相等比较操作符
void rehash(const size_type n)
重新哈希,调整容量
pair< Key, T > value_type
值类型
void swap(flat_unordered_multimap &other) noexcept(is_nothrow_swappable_v< base_type >)
交换两个容器
iterator erase(const iterator position) noexcept
删除指定位置的元素
const_iterator cend() const noexcept
获取常量结束迭代器
flat_unordered_multimap(std::initializer_list< value_type > ilist, const size_type n, const hasher &hf, const key_equal &eql)
初始化列表构造函数,指定初始容量、哈希函数和键相等比较函数
typename base_type::hasher hasher
哈希函数类型
pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
bool empty() const noexcept
检查是否为空
const value_type & const_reference
常量引用类型
void reserve(const size_type n)
预留空间
flat_unordered_multimap(const size_type n)
构造函数,指定初始容量
iterator emplace(Args &&... args)
在容器中就地构造元素
flat_unordered_multimap(Iterator first, Iterator last)
范围构造函数
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr bool is_object_v
is_object的便捷变量模板
constexpr bool is_hash_v
is_hash的便捷变量模板
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
constexpr bool is_allocator_v
is_allocator的便捷变量模板
constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板