NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
map.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_MAP_HPP__
2#define NEFORCE_CORE_CONTAINER_MAP_HPP__
3
13
15NEFORCE_BEGIN_NAMESPACE__
16
22
35template <typename Key, typename T, typename Compare = less<Key>,
36 typename Alloc = allocator<rb_tree_node<pair<const Key, T>>>>
37class map : public icollector<map<Key, T, Compare, Alloc>> {
38 static_assert(is_allocator_v<Alloc>, "Alloc type is not a standard allocator type.");
39 static_assert(is_same_v<rb_tree_node<pair<const Key, T>>, typename Alloc::value_type>, "allocator type mismatch.");
40 static_assert(is_object_v<T>, "map only contains object types.");
41
42public:
43 using key_type = Key;
44 using data_type = T;
45 using mapped_type = T;
47 using key_compare = Compare;
48
56 private:
57 Compare comp_;
58 friend class map;
59
60 public:
67 bool operator()(const value_type& lhs, const value_type& rhs) const noexcept {
68 return comp_(lhs.first, rhs.first);
69 }
70 };
71
72private:
73 using base_type =
75
76public:
79 using pointer = typename base_type::pointer;
83 using iterator = typename base_type::iterator;
88
89private:
90 base_type tree_;
91
92public:
98 map() :
99 tree_(Compare()) {}
100
105 explicit map(const key_compare& comp) :
106 tree_(comp) {}
107
112 map(const map& other) :
113 tree_(other.tree_) {}
114
120 map& operator=(const map& other) {
121 if (_NEFORCE addressof(other) == this) {
122 return *this;
123 }
124 tree_ = other.tree_;
125 return *this;
126 }
127
133 tree_(_NEFORCE move(other.tree_)) {}
134
141 if (_NEFORCE addressof(other) == this) {
142 return *this;
143 }
144 tree_ = _NEFORCE move(other.tree_);
145 return *this;
146 }
147
154 template <typename Iterator>
155 map(Iterator first, Iterator last) :
156 tree_(Compare()) {
157 tree_.insert_unique(first, last);
158 }
159
166 template <typename Iterator>
167 map(Iterator first, Iterator last, const key_compare& comp) :
168 tree_(comp) {
169 tree_.insert_unique(first, last);
170 }
171
176 map(std::initializer_list<value_type> ilist) :
177 map(ilist.begin(), ilist.end()) {}
178
184 map(std::initializer_list<value_type> ilist, const key_compare& comp) :
185 map(ilist.begin(), ilist.end(), comp) {}
186
192 map& operator=(std::initializer_list<value_type> ilist) {
193 clear();
194 insert(ilist.begin(), ilist.end());
195 return *this;
196 }
197
201 ~map() = default;
202
207 NEFORCE_NODISCARD iterator begin() noexcept { return tree_.begin(); }
208
213 NEFORCE_NODISCARD iterator end() noexcept { return tree_.end(); }
214
219 NEFORCE_NODISCARD const_iterator begin() const noexcept { return tree_.cbegin(); }
220
225 NEFORCE_NODISCARD const_iterator end() const noexcept { return tree_.cend(); }
226
231 NEFORCE_NODISCARD const_iterator cbegin() const noexcept { return tree_.cbegin(); }
232
237 NEFORCE_NODISCARD const_iterator cend() const noexcept { return tree_.cend(); }
238
243 NEFORCE_NODISCARD reverse_iterator rbegin() noexcept { return tree_.rbegin(); }
244
249 NEFORCE_NODISCARD reverse_iterator rend() noexcept { return tree_.rend(); }
250
255 NEFORCE_NODISCARD const_reverse_iterator rbegin() const noexcept { return tree_.rbegin(); }
256
261 NEFORCE_NODISCARD const_reverse_iterator rend() const noexcept { return tree_.rend(); }
262
267 NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept { return tree_.crbegin(); }
268
273 NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept { return tree_.crend(); }
274
279 NEFORCE_NODISCARD size_type size() const noexcept { return tree_.size(); }
280
285 NEFORCE_NODISCARD size_type max_size() const noexcept { return tree_.max_size(); }
286
291 NEFORCE_NODISCARD bool empty() const noexcept { return tree_.empty(); }
292
297 NEFORCE_NODISCARD key_compare key_comp() const noexcept { return tree_.key_compare(); }
298
303 NEFORCE_NODISCARD value_compare value_comp() const noexcept { return value_compare(tree_.key_compare()); }
304
311 template <typename... Args>
313 return tree_.emplace_unique(_NEFORCE forward<Args>(args)...);
314 }
315
321 pair<iterator, bool> insert(const value_type& value) { return tree_.insert_unique(value); }
322
328 pair<iterator, bool> insert(value_type&& value) { return tree_.emplace_unique(_NEFORCE move(value)); }
329
337 template <typename... Args>
338 iterator emplace_hint(iterator position, Args&&... args) {
339 return tree_.emplace_unique_hint(position, _NEFORCE forward<Args>(args)...);
340 }
341
348 iterator insert(iterator position, const value_type& value) { return tree_.insert_unique(position, value); }
349
356 iterator insert(iterator position, value_type&& value) {
357 return tree_.insert_unique(position, _NEFORCE move(value));
358 }
359
366 template <typename Iterator>
367 void insert(Iterator first, Iterator last) {
368 tree_.insert_unique(first, last);
369 }
370
375 void erase(iterator position) noexcept(noexcept(tree_.erase(position))) { tree_.erase(position); }
376
382 size_type erase(const key_type& key) noexcept(noexcept(tree_.erase(key))) { return tree_.erase(key); }
383
389 void erase(iterator first, iterator last) noexcept(noexcept(tree_.erase(first, last))) { tree_.erase(first, last); }
390
394 void clear() noexcept(noexcept(tree_.clear())) { tree_.clear(); }
395
401 NEFORCE_NODISCARD iterator find(const key_type& key) { return tree_.find(key); }
402
408 NEFORCE_NODISCARD const_iterator find(const key_type& key) const { return tree_.find(key); }
409
415 NEFORCE_NODISCARD size_type count(const key_type& key) const { return tree_.count(key); }
416
422 NEFORCE_NODISCARD iterator lower_bound(const key_type& key) { return tree_.lower_bound(key); }
423
429 NEFORCE_NODISCARD const_iterator lower_bound(const key_type& key) const { return tree_.lower_bound(key); }
430
436 NEFORCE_NODISCARD iterator upper_bound(const key_type& key) { return tree_.upper_bound(key); }
437
443 NEFORCE_NODISCARD const_iterator upper_bound(const key_type& key) const { return tree_.upper_bound(key); }
444
450 NEFORCE_NODISCARD pair<iterator, iterator> equal_range(const key_type& key) { return tree_.equal_range(key); }
451
457 NEFORCE_NODISCARD pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
458 return tree_.equal_range(key);
459 }
460
468 NEFORCE_NODISCARD mapped_type& operator[](const key_type& key) {
469 iterator iter = tree_.lower_bound(key);
470 if (iter == end() || key_comp()(key, iter->first)) {
471 iter = tree_.emplace_unique_hint(iter, key, initialize<T>());
472 }
473 return iter->second;
474 }
475
483 NEFORCE_NODISCARD mapped_type& operator[](key_type&& key) {
484 iterator iter = tree_.lower_bound(key);
485 if (iter == end() || key_comp()(key, iter->first)) {
486 iter = tree_.emplace_unique_hint(iter, _NEFORCE move(key), initialize<T>());
487 }
488 return iter->second;
489 }
490
497 NEFORCE_NODISCARD const mapped_type& at(const key_type& key) const {
498 const_iterator iter = tree_.lower_bound(key);
499 if (iter == end() && key_comp()(iter->first, key)) {
500 NEFORCE_THROW_EXCEPTION(value_exception("the value of this key does not exists."));
501 }
502 return iter->second;
503 }
504
511 NEFORCE_NODISCARD mapped_type& at(const key_type& key) {
512 iterator iter = tree_.lower_bound(key);
513 if (iter == end() && key_comp()(iter->first, key)) {
514 NEFORCE_THROW_EXCEPTION(value_exception("the value of this key does not exists."));
515 }
516 return iter->second;
517 }
518
523 void swap(map& other) noexcept(noexcept(tree_.swap(other.tree_))) { tree_.swap(other.tree_); }
524
530 NEFORCE_NODISCARD bool operator==(const map& rhs) const noexcept(noexcept(tree_ == rhs.tree_)) {
531 return tree_ == rhs.tree_;
532 }
533
539 NEFORCE_NODISCARD bool operator<(const map& rhs) const noexcept(noexcept(tree_ < rhs.tree_)) {
540 return tree_ < rhs.tree_;
541 }
542};
543
544#ifdef NEFORCE_STANDARD_17
545template <typename Iterator, typename Compare,
547map(Iterator, Iterator, Compare = Compare(), Alloc = Alloc())
549
550template <typename Key, typename T, typename Compare = less<Key>, typename Alloc = allocator<pair<const Key, T>>>
551map(std::initializer_list<pair<Key, T>>, Compare = Compare(), Alloc = Alloc()) -> map<Key, T, Compare, Alloc>;
552
553template <typename Iterator, typename Alloc>
554map(Iterator, Iterator, Alloc)
556
557template <typename Key, typename T, typename Alloc>
558map(std::initializer_list<pair<Key, T>>, Alloc) -> map<Key, T, less<Key>, Alloc>;
559#endif
560 // Container
562
563NEFORCE_END_NAMESPACE__
564#endif // NEFORCE_CORE_CONTAINER_MAP_HPP__
映射容器
定义 map.hpp:37
typename base_type::iterator iterator
迭代器类型
定义 map.hpp:83
NEFORCE_NODISCARD reverse_iterator rbegin() noexcept
获取反向起始迭代器
map(const key_compare &comp)
构造函数,指定比较函数
map(const map &other)
拷贝构造函数
map & operator=(std::initializer_list< value_type > ilist)
初始化列表赋值运算符
map(map &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
NEFORCE_NODISCARD bool operator==(const map &rhs) const noexcept(noexcept(tree_==rhs.tree_))
相等比较操作符
NEFORCE_NODISCARD reverse_iterator rend() noexcept
获取反向结束迭代器
typename base_type::const_reverse_iterator const_reverse_iterator
常量反向迭代器类型
定义 map.hpp:86
NEFORCE_NODISCARD iterator lower_bound(const key_type &key)
获取第一个不小于指定键的元素位置
NEFORCE_NODISCARD const_iterator cend() const noexcept
获取常量结束迭代器
void swap(map &other) noexcept(noexcept(tree_.swap(other.tree_)))
交换两个map的内容
typename base_type::pointer pointer
指针类型
定义 map.hpp:79
iterator insert(iterator position, const value_type &value)
在提示位置附近拷贝插入元素
Key key_type
键类型
定义 map.hpp:43
NEFORCE_NODISCARD pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
pair< iterator, bool > insert(value_type &&value)
移动插入元素
map(std::initializer_list< value_type > ilist)
初始化列表构造函数
typename base_type::allocator_type allocator_type
分配器类型
定义 map.hpp:87
NEFORCE_NODISCARD const mapped_type & at(const key_type &key) const
带边界检查的常量访问
size_type erase(const key_type &key) noexcept(noexcept(tree_.erase(key)))
删除所有具有指定键的元素
NEFORCE_NODISCARD iterator upper_bound(const key_type &key)
获取第一个大于指定键的元素位置
NEFORCE_NODISCARD key_compare key_comp() const noexcept
获取键比较函数对象
map & operator=(map &&other) noexcept(is_nothrow_move_assignable_v< base_type >)
移动赋值运算符
void clear() noexcept(noexcept(tree_.clear()))
清空map
void erase(iterator first, iterator last) noexcept(noexcept(tree_.erase(first, last)))
删除指定范围内的元素
map(Iterator first, Iterator last)
范围构造函数
NEFORCE_NODISCARD bool operator<(const map &rhs) const noexcept(noexcept(tree_< rhs.tree_))
小于比较操作符
typename base_type::const_iterator const_iterator
常量迭代器类型
定义 map.hpp:84
NEFORCE_NODISCARD mapped_type & operator[](key_type &&key)
右值键下标访问操作符
void erase(iterator position) noexcept(noexcept(tree_.erase(position)))
删除指定位置的元素
typename base_type::reverse_iterator reverse_iterator
反向迭代器类型
定义 map.hpp:85
NEFORCE_NODISCARD mapped_type & operator[](const key_type &key)
下标访问操作符
NEFORCE_NODISCARD const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD iterator begin() noexcept
获取起始迭代器
NEFORCE_NODISCARD pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
Compare key_compare
键比较函数类型
定义 map.hpp:47
NEFORCE_NODISCARD const_iterator lower_bound(const key_type &key) const
获取第一个不小于指定键的常量元素位置
T mapped_type
映射值类型
定义 map.hpp:45
NEFORCE_NODISCARD const_iterator find(const key_type &key) const
常量查找具有指定键的元素
map & operator=(const map &other)
拷贝赋值运算符
NEFORCE_NODISCARD size_type count(const key_type &key) const
统计具有指定键的元素数量
NEFORCE_NODISCARD const_iterator cbegin() const noexcept
获取常量起始迭代器
typename base_type::difference_type difference_type
差值类型
定义 map.hpp:78
NEFORCE_NODISCARD size_type max_size() const noexcept
获取元素数量
iterator emplace_hint(iterator position, Args &&... args)
在提示位置附近就地构造元素
~map()=default
析构函数
NEFORCE_NODISCARD const_iterator end() const noexcept
获取常量结束迭代器
typename base_type::const_pointer const_pointer
常量指针类型
定义 map.hpp:80
NEFORCE_NODISCARD bool empty() const noexcept
获取元素数量
NEFORCE_NODISCARD value_compare value_comp() const noexcept
获取值比较函数对象
map()
默认构造函数
定义 map.hpp:98
map(std::initializer_list< value_type > ilist, const key_compare &comp)
初始化列表构造函数,指定比较函数
NEFORCE_NODISCARD iterator end() noexcept
获取结束迭代器
pair< const Key, T > value_type
值类型
定义 map.hpp:46
NEFORCE_NODISCARD const_iterator upper_bound(const key_type &key) const
获取第一个大于指定键的常量元素位置
NEFORCE_NODISCARD const_iterator begin() const noexcept
获取常量起始迭代器
pair< iterator, bool > emplace(Args &&... args)
构造元素
typename base_type::const_reference const_reference
常量引用类型
定义 map.hpp:82
NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
typename base_type::size_type size_type
大小类型
定义 map.hpp:77
void insert(Iterator first, Iterator last)
范围插入元素
typename base_type::reference reference
引用类型
定义 map.hpp:81
NEFORCE_NODISCARD size_type size() const noexcept
获取元素数量
NEFORCE_NODISCARD mapped_type & at(const key_type &key)
带边界检查的访问
NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
map(Iterator first, Iterator last, const key_compare &comp)
范围构造函数
pair< iterator, bool > insert(const value_type &value)
拷贝插入元素
iterator insert(iterator position, value_type &&value)
在提示位置附近移动插入元素
NEFORCE_NODISCARD const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
T data_type
数据类型
定义 map.hpp:44
NEFORCE_NODISCARD iterator find(const key_type &key)
查找具有指定键的元素
红黑树容器
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
typename iter_value_t< Iterator >::second_type iter_map_value_t
从映射迭代器中提取值类型
standard_allocator< T > allocator
标准分配器别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_INLINE17 constexpr bool is_allocator_v
is_allocator的便捷变量模板
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
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的便捷变量模板
红黑树容器
集合器接口模板
小于比较仿函数
值比较函数对象
定义 map.hpp:55
bool operator()(const value_type &lhs, const value_type &rhs) const noexcept
比较两个键值对
定义 map.hpp:67
存储两个值的元组对
选择pair的第一个元素
变量处理异常