NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
unordered_map.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_UNORDERED_MAP_HPP__
2#define NEFORCE_CORE_CONTAINER_UNORDERED_MAP_HPP__
3
13
15NEFORCE_BEGIN_NAMESPACE__
16
22
36template <typename Key, typename T, typename HashFcn = hash<Key>, typename EqualKey = equal_to<Key>,
37 typename Alloc = allocator<hashtable_node<pair<const Key, T>>>>
38class unordered_map : public icollector<unordered_map<Key, T, HashFcn, EqualKey, Alloc>> {
39 static_assert(is_hash_v<HashFcn, Key>, "unordered map requires valid hash function.");
40 static_assert(is_allocator_v<Alloc>, "Alloc type is not a standard allocator type.");
41 static_assert(is_same_v<hashtable_node<pair<const Key, T>>, typename Alloc::value_type>,
42 "allocator type mismatch.");
43 static_assert(is_object_v<Key>, "unordered map only contains object types.");
44
45 using base_type = hashtable<pair<const Key, T>, Key, HashFcn, select1st<pair<const Key, T>>, EqualKey,
46 Alloc>;
47
48public:
49 using key_type = typename base_type::key_type;
51 using hasher = typename base_type::hasher;
53
56 using pointer = typename base_type::pointer;
60 using iterator = typename base_type::iterator;
63
64private:
65 base_type ht_{100};
66
67public:
73 unordered_map() = default;
74
80 ht_(n) {}
81
88 ht_(n, hf, key_equal()) {}
89
96 unordered_map(size_type n, const hasher& hf, const key_equal& eql) :
97 ht_(n, hf, eql) {}
98
104 ht_(other.ht_) {}
105
112 ht_ = other.ht_;
113 return *this;
114 }
115
121 ht_(_NEFORCE move(other.ht_)) {}
122
129 ht_ = _NEFORCE move(other.ht_);
130 return *this;
131 }
132
139 template <typename Iterator>
140 unordered_map(Iterator first, Iterator last) :
141 ht_(100, hasher(), key_equal()) {
142 ht_.insert_unique(first, last);
143 }
144
152 template <typename Iterator>
153 unordered_map(Iterator first, Iterator list, size_type n) :
154 ht_(n, hasher(), key_equal()) {
155 ht_.insert_unique(first, list);
156 }
157
166 template <typename Iterator>
167 unordered_map(Iterator first, Iterator last, size_type n, const hasher& hf) :
168 ht_(n, hf, key_equal()) {
169 ht_.insert_unique(first, last);
170 }
171
181 template <typename Iterator>
182 unordered_map(Iterator first, Iterator last, size_type n, const hasher& hf, const key_equal& eql) :
183 ht_(n, hf, eql) {
184 ht_.insert_unique(first, last);
185 }
186
191 unordered_map(std::initializer_list<value_type> ilist) :
192 unordered_map(ilist.begin(), ilist.end()) {}
193
199 unordered_map(std::initializer_list<value_type> ilist, size_type n) :
200 unordered_map(ilist.begin(), ilist.end(), n) {}
201
208 unordered_map(std::initializer_list<value_type> ilist, size_type n, const hasher& hf) :
209 unordered_map(ilist.begin(), ilist.end(), n, hf) {}
210
218 unordered_map(std::initializer_list<value_type> ilist, size_type n, const hasher& hf, const key_equal& eql) :
219 unordered_map(ilist.begin(), ilist.end(), n, hf, eql) {}
220
225 NEFORCE_NODISCARD iterator begin() noexcept { return ht_.begin(); }
226
231 NEFORCE_NODISCARD iterator end() noexcept { return ht_.end(); }
232
237 NEFORCE_NODISCARD const_iterator begin() const noexcept { return ht_.begin(); }
238
243 NEFORCE_NODISCARD const_iterator end() const noexcept { return ht_.end(); }
244
249 NEFORCE_NODISCARD const_iterator cbegin() const noexcept { return ht_.cbegin(); }
250
255 NEFORCE_NODISCARD const_iterator cend() const noexcept { return ht_.cend(); }
256
261 NEFORCE_NODISCARD size_type size() const noexcept { return ht_.size(); }
262
267 NEFORCE_NODISCARD size_type max_size() const noexcept { return ht_.max_size(); }
268
273 NEFORCE_NODISCARD bool empty() const noexcept { return ht_.empty(); }
274
280 NEFORCE_NODISCARD size_type count(const key_type& key) const noexcept(noexcept(ht_.count(key))) {
281 return ht_.count(key);
282 }
283
288 NEFORCE_NODISCARD size_type buckets_size() const noexcept { return ht_.buckets_size(); }
289
294 NEFORCE_NODISCARD size_type buckets_max_count() const noexcept { return ht_.buckets_max_size(); }
295
301 NEFORCE_NODISCARD size_type bucket_size(size_type n) const noexcept { return ht_.bucket_size(n); }
302
307 NEFORCE_NODISCARD hasher hash_func() const noexcept(noexcept(ht_.hash_func())) { return ht_.hash_func(); }
308
313 NEFORCE_NODISCARD key_equal key_eql() const noexcept(noexcept(ht_.key_eql())) { return ht_.key_eql(); }
314
319 NEFORCE_NODISCARD float load_factor() const noexcept { return ht_.load_factor(); }
320
325 NEFORCE_NODISCARD float max_load_factor() const noexcept { return ht_.max_load_factor(); }
326
331 void max_load_factor(float lf) noexcept { ht_.max_load_factor(lf); }
332
337 void rehash(size_type n) { ht_.rehash(n); }
338
345 void reserve(size_type n) { ht_.reserve(n); }
346
353 template <typename... Args>
355 return ht_.emplace_unique(_NEFORCE forward<Args>(args)...);
356 }
357
363 pair<iterator, bool> insert(const value_type& value) { return ht_.insert_unique(value); }
364
370 pair<iterator, bool> insert(value_type&& value) { return ht_.insert_unique(_NEFORCE forward<value_type>(value)); }
371
378 template <typename Iterator>
379 void insert(Iterator first, Iterator last) {
380 ht_.insert_unique(first, last);
381 }
382
388 size_type erase(const key_type& key) noexcept { return ht_.erase(key); }
389
395 iterator erase(iterator position) noexcept { return ht_.erase(position); }
396
403 iterator erase(iterator first, iterator last) noexcept { return ht_.erase(first, last); }
404
410 const_iterator erase(const_iterator position) noexcept { return ht_.erase(position); }
411
418 const_iterator erase(const_iterator first, const_iterator last) noexcept { return ht_.erase(first, last); }
419
423 void clear() noexcept { ht_.clear(); }
424
430 NEFORCE_NODISCARD iterator find(const key_type& key) { return ht_.find(key); }
431
437 NEFORCE_NODISCARD const_iterator find(const key_type& key) const { return ht_.find(key); }
438
444 NEFORCE_NODISCARD pair<iterator, iterator> equal_range(const key_type& key) { return ht_.equal_range(key); }
445
451 NEFORCE_NODISCARD pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
452 return ht_.equal_range(key);
453 }
454
462 NEFORCE_NODISCARD T& operator[](const key_type& key) {
463 auto iter = ht_.find(key);
464 if (iter == ht_.end()) {
465 iter = ht_.emplace_unique(key, T()).first;
466 }
467 return iter->second;
468 }
469
476 NEFORCE_NODISCARD const T& at(const key_type& key) const {
477 auto iter = ht_.find(key);
478 if (iter == end()) {
479 NEFORCE_THROW_EXCEPTION(iterator_exception("unordered_map key-value does not exists"));
480 }
481 return iter->second;
482 }
483
490 NEFORCE_NODISCARD T& at(const key_type& key) {
491 auto iter = ht_.find(key);
492 if (iter == end()) {
493 NEFORCE_THROW_EXCEPTION(iterator_exception("unordered_map key-value does not exists"));
494 }
495 return iter->second;
496 }
497
502 void swap(unordered_map& other) noexcept(is_nothrow_swappable_v<base_type>) { ht_.swap(other.ht_); }
503
509 NEFORCE_NODISCARD bool operator==(const unordered_map& rhs) const noexcept(noexcept(ht_ == rhs.ht_)) {
510 return ht_ == rhs.ht_;
511 }
512
518 NEFORCE_NODISCARD bool operator<(const unordered_map& rhs) const noexcept(noexcept(ht_ < rhs.ht_)) {
519 return ht_ < rhs.ht_;
520 }
521};
522
523#ifdef NEFORCE_STANDARD_17
524template <typename Iterator, typename HashFcn = hash<iter_map_key_t<Iterator>>,
525 typename Compare = equal_to<iter_map_key_t<Iterator>>, typename Alloc>
526unordered_map(Iterator, Iterator, HashFcn = HashFcn(), Compare = Compare(), Alloc = Alloc())
528
529template <typename Key, typename T, typename HashFcn = hash<Key>, typename Compare = equal_to<Key>,
530 typename Alloc = allocator<pair<const Key, T>>>
531unordered_map(std::initializer_list<pair<Key, T>>, HashFcn = HashFcn(), Compare = Compare(), Alloc = Alloc())
533
534template <typename Iterator, typename Alloc>
535unordered_map(Iterator, Iterator, Alloc)
538
539template <typename Iterator, typename HashFcn, typename Alloc>
541 HashFcn, equal_to<iter_map_key_t<Iterator>>, Alloc>;
542
543template <typename Key, typename T, typename Alloc>
544unordered_map(std::initializer_list<pair<Key, T>>, Alloc) -> unordered_map<Key, T, hash<Key>, equal_to<Key>, Alloc>;
545
546template <typename Key, typename T, typename HashFcn, typename Alloc>
547unordered_map(std::initializer_list<pair<Key, T>>, HashFcn, Alloc)
549#endif
550 // Container
552
553NEFORCE_END_NAMESPACE__
554#endif // NEFORCE_CORE_CONTAINER_UNORDERED_MAP_HPP__
哈希表容器
双向链表容器
无序映射容器
pair< iterator, bool > insert(const value_type &value)
插入元素(拷贝版本)
NEFORCE_NODISCARD key_equal key_eql() const noexcept(noexcept(ht_.key_eql()))
获取键相等比较函数对象
unordered_map & operator=(const unordered_map &other)
拷贝赋值运算符
NEFORCE_NODISCARD size_type count(const key_type &key) const noexcept(noexcept(ht_.count(key)))
统计具有指定键的元素数量
pair< iterator, bool > emplace(Args &&... args)
在unordered_map中就地构造元素
const_iterator erase(const_iterator position) noexcept
删除指定位置的常量元素
unordered_map()=default
默认构造函数
size_type erase(const key_type &key) noexcept
删除所有具有指定键的元素
NEFORCE_NODISCARD size_type size() const noexcept
获取元素数量
NEFORCE_NODISCARD hasher hash_func() const noexcept(noexcept(ht_.hash_func()))
获取哈希函数对象
unordered_map(Iterator first, Iterator last, size_type n, const hasher &hf, const key_equal &eql)
范围构造函数,指定初始桶数、哈希函数和键相等比较函数
NEFORCE_NODISCARD size_type bucket_size(size_type n) const noexcept
获取指定桶的大小
NEFORCE_NODISCARD bool empty() const noexcept
检查是否为空
unordered_map(size_type n)
构造函数,指定初始桶数
NEFORCE_NODISCARD bool operator==(const unordered_map &rhs) const noexcept(noexcept(ht_==rhs.ht_))
相等比较操作符
NEFORCE_NODISCARD const_iterator cend() const noexcept
获取常量结束迭代器
iterator erase(iterator first, iterator last) noexcept
删除指定范围内的元素
NEFORCE_NODISCARD const_iterator end() const noexcept
获取常量结束迭代器
NEFORCE_NODISCARD pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
unordered_map(Iterator first, Iterator last, size_type n, const hasher &hf)
范围构造函数,指定初始桶数和哈希函数
NEFORCE_NODISCARD iterator find(const key_type &key)
查找具有指定键的元素
unordered_map(std::initializer_list< value_type > ilist, size_type n, const hasher &hf, const key_equal &eql)
初始化列表构造函数,指定初始桶数、哈希函数和键相等比较函数
unordered_map(unordered_map &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
void rehash(size_type n)
重新哈希,调整桶数量
unordered_map(const unordered_map &other)
拷贝构造函数
typename base_type::value_type value_type
值类型
typename base_type::size_type size_type
大小类型
void max_load_factor(float lf) noexcept
设置最大负载因子
unordered_map & operator=(unordered_map &&other) noexcept(is_nothrow_move_assignable_v< base_type >)
移动赋值运算符
void insert(Iterator first, Iterator last)
范围插入元素
NEFORCE_NODISCARD T & operator[](const key_type &key)
下标访问操作符
typename base_type::key_equal key_equal
键相等比较函数类型
unordered_map(size_type n, const hasher &hf, const key_equal &eql)
构造函数,指定初始桶数、哈希函数和键相等比较函数
NEFORCE_NODISCARD iterator begin() noexcept
获取起始迭代器
unordered_map(std::initializer_list< value_type > ilist, size_type n)
初始化列表构造函数,指定初始桶数
typename base_type::iterator iterator
迭代器类型
unordered_map(Iterator first, Iterator list, size_type n)
范围构造函数,指定初始桶数
typename base_type::hasher hasher
哈希函数类型
pair< iterator, bool > insert(value_type &&value)
移动插入元素
NEFORCE_NODISCARD iterator end() noexcept
获取结束迭代器
typename base_type::difference_type difference_type
差值类型
NEFORCE_NODISCARD size_type buckets_size() const noexcept
获取桶数量
unordered_map(std::initializer_list< value_type > ilist)
初始化列表构造函数
NEFORCE_NODISCARD size_type buckets_max_count() const noexcept
获取最大桶数量
typename base_type::allocator_type allocator_type
分配器类型
NEFORCE_NODISCARD size_type max_size() const noexcept
获取最大可能大小
NEFORCE_NODISCARD pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
NEFORCE_NODISCARD const_iterator begin() const noexcept
获取常量起始迭代器
unordered_map(Iterator first, Iterator last)
范围构造函数
NEFORCE_NODISCARD bool operator<(const unordered_map &rhs) const noexcept(noexcept(ht_< rhs.ht_))
小于比较操作符
typename base_type::const_reference const_reference
常量引用类型
typename base_type::pointer pointer
指针类型
void swap(unordered_map &other) noexcept(is_nothrow_swappable_v< base_type >)
交换两个unordered_map的内容
void reserve(size_type n)
预留空间
typename base_type::const_pointer const_pointer
常量指针类型
NEFORCE_NODISCARD T & at(const key_type &key)
带边界检查的访问
unordered_map(size_type n, const hasher &hf)
构造函数,指定初始桶数和哈希函数
NEFORCE_NODISCARD const_iterator cbegin() const noexcept
获取常量起始迭代器
NEFORCE_NODISCARD float load_factor() const noexcept
获取当前负载因子
iterator erase(iterator position) noexcept
删除指定位置的元素
NEFORCE_NODISCARD const T & at(const key_type &key) const
带边界检查的常量访问
unordered_map(std::initializer_list< value_type > ilist, size_type n, const hasher &hf)
初始化列表构造函数,指定初始桶数和哈希函数
NEFORCE_NODISCARD const_iterator find(const key_type &key) const
查找具有指定键的常量元素
void clear() noexcept
清空unordered_map
typename base_type::reference reference
引用类型
typename base_type::const_iterator const_iterator
常量迭代器类型
const_iterator erase(const_iterator first, const_iterator last) noexcept
删除指定范围内的常量元素
typename base_type::key_type key_type
键类型
NEFORCE_NODISCARD float max_load_factor() const noexcept
获取最大负载因子
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
constexpr bool is_hash_v
is_hash的便捷变量模板
typename iter_value_t< Iterator >::second_type iter_map_value_t
从映射迭代器中提取值类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_allocator_v
is_allocator的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
哈希表容器
相等比较仿函数
哈希函数的主模板
集合器接口模板
指针或迭代器行为异常
存储两个值的元组对
选择pair的第一个元素