NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
multimap.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_MULTIMAP_HPP__
2#define NEFORCE_CORE_CONTAINER_MULTIMAP_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 multimap : public icollector<multimap<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>, "multimap 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
55 struct value_compare {
56 private:
57 Compare comp_;
58 friend class multimap;
59
60 public:
61 explicit value_compare(Compare comp) :
62 comp_(comp) {}
63
70 bool operator()(const value_type& lhs, const value_type& rhs) const noexcept {
71 return comp_(lhs.first, rhs.first);
72 }
73 };
74
75private:
76 using base_type =
78
79public:
82 using pointer = typename base_type::pointer;
86 using iterator = typename base_type::iterator;
91
92private:
93 base_type tree_;
94
95public:
102 tree_(Compare()) {}
103
108 explicit multimap(const key_compare& comp) :
109 tree_(comp) {}
110
115 multimap(const multimap& other) :
116 tree_(other.tree_) {}
117
123 multimap& operator=(const multimap& other) {
124 tree_ = other.tree_;
125 return *this;
126 }
127
133 tree_(_NEFORCE move(other.tree_)) {}
134
141 tree_ = _NEFORCE move(other.tree_);
142 return *this;
143 }
144
151 template <typename Iterator>
152 multimap(Iterator first, Iterator last) :
153 tree_(Compare()) {
154 tree_.insert_equal(first, last);
155 }
156
164 template <typename Iterator>
165 multimap(Iterator first, Iterator last, const key_compare& comp) :
166 tree_(comp) {
167 tree_.insert_equal(first, last);
168 }
169
174 multimap(std::initializer_list<value_type> ilist) :
175 multimap(ilist.begin(), ilist.end()) {}
176
182 multimap(std::initializer_list<value_type> ilist, const key_compare& comp) :
183 multimap(ilist.begin(), ilist.end(), comp) {}
184
190 multimap& operator=(std::initializer_list<value_type> ilist) {
191 clear();
192 insert(ilist.begin(), ilist.end());
193 return *this;
194 }
195
199 ~multimap() = default;
200
205 NEFORCE_NODISCARD iterator begin() noexcept { return tree_.begin(); }
206
211 NEFORCE_NODISCARD iterator end() noexcept { return tree_.end(); }
212
217 NEFORCE_NODISCARD const_iterator begin() const noexcept { return tree_.cbegin(); }
218
223 NEFORCE_NODISCARD const_iterator end() const noexcept { return tree_.cend(); }
224
229 NEFORCE_NODISCARD const_iterator cbegin() const noexcept { return tree_.cbegin(); }
230
235 NEFORCE_NODISCARD const_iterator cend() const noexcept { return tree_.cend(); }
236
241 NEFORCE_NODISCARD reverse_iterator rbegin() noexcept { return tree_.rbegin(); }
242
247 NEFORCE_NODISCARD reverse_iterator rend() noexcept { return tree_.rend(); }
248
253 NEFORCE_NODISCARD const_reverse_iterator rbegin() const noexcept { return tree_.rbegin(); }
254
259 NEFORCE_NODISCARD const_reverse_iterator rend() const noexcept { return tree_.rend(); }
260
265 NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept { return tree_.crbegin(); }
266
271 NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept { return tree_.crend(); }
272
277 NEFORCE_NODISCARD size_type size() const noexcept { return tree_.size(); }
278
283 NEFORCE_NODISCARD size_type max_size() const noexcept { return tree_.max_size(); }
284
289 NEFORCE_NODISCARD bool empty() const noexcept { return tree_.empty(); }
290
295 NEFORCE_NODISCARD key_compare key_comp() const noexcept { return tree_.key_compare(); }
296
301 NEFORCE_NODISCARD value_compare value_comp() const noexcept { return value_compare(tree_.key_compare()); }
302
309 template <typename... Args>
310 iterator emplace(Args&&... args) {
311 return tree_.emplace_equal(_NEFORCE forward<Args>(args)...);
312 }
313
319 iterator insert(const value_type& value) { return tree_.insert_equal(value); }
320
326 iterator insert(value_type&& value) { return tree_.insert_equal(_NEFORCE move(value)); }
327
335 template <typename... Args>
336 iterator emplace_hint(iterator position, Args&&... args) {
337 return tree_.emplace_equal_hint(position, _NEFORCE forward<Args>(args)...);
338 }
339
346 iterator insert(iterator position, const value_type& value) { return tree_.insert_equal(position, value); }
347
354 iterator insert(iterator position, value_type&& value) {
355 return tree_.insert_equal(position, _NEFORCE move(value));
356 }
357
364 template <typename Iterator>
365 void insert(Iterator first, Iterator last) {
366 tree_.insert_equal(first, last);
367 }
368
373 void erase(iterator position) noexcept(noexcept(tree_.erase(position))) { tree_.erase(position); }
374
380 size_type erase(const key_type& key) noexcept(noexcept(tree_.erase(key))) { return tree_.erase(key); }
381
387 void erase(iterator first, iterator last) noexcept(noexcept(tree_.erase(first, last))) { tree_.erase(first, last); }
388
392 void clear() noexcept(noexcept(tree_.clear())) { tree_.clear(); }
393
399 NEFORCE_NODISCARD iterator find(const key_type& key) { return tree_.find(key); }
400
406 NEFORCE_NODISCARD const_iterator find(const key_type& key) const { return tree_.find(key); }
407
413 NEFORCE_NODISCARD size_type count(const key_type& key) const { return tree_.count(key); }
414
420 NEFORCE_NODISCARD iterator lower_bound(const key_type& key) { return tree_.lower_bound(key); }
421
427 NEFORCE_NODISCARD const_iterator lower_bound(const key_type& key) const { return tree_.lower_bound(key); }
428
434 NEFORCE_NODISCARD iterator upper_bound(const key_type& key) { return tree_.upper_bound(key); }
435
441 NEFORCE_NODISCARD const_iterator upper_bound(const key_type& key) const { return tree_.upper_bound(key); }
442
448 NEFORCE_NODISCARD pair<iterator, iterator> equal_range(const key_type& key) { return tree_.equal_range(key); }
449
455 NEFORCE_NODISCARD pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
456 return tree_.equal_range(key);
457 }
458
463 void swap(multimap& other) noexcept(is_nothrow_swappable_v<base_type>) { tree_.swap(other.tree_); }
464
470 NEFORCE_NODISCARD bool equal_to(const multimap& rhs) const noexcept(noexcept(tree_ == rhs.tree_)) {
471 return tree_ == rhs.tree_;
472 }
473
479 NEFORCE_NODISCARD bool less_than(const multimap& rhs) const noexcept(noexcept(tree_ < rhs.tree_)) {
480 return tree_ < rhs.tree_;
481 }
482};
483
484#ifdef NEFORCE_STANDARD_17
485template <typename Iterator, typename Compare,
487multimap(Iterator, Iterator, Compare = Compare(), Alloc = Alloc())
489
490template <typename Key, typename T, typename Compare = less<Key>, typename Alloc = allocator<pair<const Key, T>>>
491multimap(std::initializer_list<pair<Key, T>>, Compare = Compare(), Alloc = Alloc()) -> multimap<Key, T, Compare, Alloc>;
492
493template <typename Iterator, typename Alloc>
494multimap(Iterator, Iterator, Alloc)
496
497template <typename Key, typename T, typename Alloc>
498multimap(std::initializer_list<pair<Key, T>>, Alloc) -> multimap<Key, T, less<Key>, Alloc>;
499#endif
500 // Container
502
503NEFORCE_END_NAMESPACE__
504#endif // NEFORCE_CORE_CONTAINER_MULTIMAP_HPP__
多重映射容器
const_iterator upper_bound(const key_type &key) const
获取第一个大于指定键的常量元素位置
reverse_iterator rbegin() noexcept
获取反向起始迭代器
iterator lower_bound(const key_type &key)
获取第一个不小于指定键的元素位置
size_type erase(const key_type &key) noexcept(noexcept(tree_.erase(key)))
删除所有具有指定键的元素
bool equal_to(const multimap &rhs) const noexcept(noexcept(tree_==rhs.tree_))
相等比较操作符
iterator find(const key_type &key)
查找具有指定键的元素
pair< const Key, T > value_type
值类型
multimap(const key_compare &comp)
构造函数,指定比较函数
Compare key_compare
键比较函数类型
const_iterator find(const key_type &key) const
查找具有指定键的常量元素
iterator end() noexcept
获取结束迭代器
reverse_iterator rend() noexcept
获取反向结束迭代器
iterator emplace_hint(iterator position, Args &&... args)
在提示位置附近就地构造元素
iterator begin() noexcept
获取起始迭代器
typename base_type::const_pointer const_pointer
常量指针类型
const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
iterator insert(iterator position, const value_type &value)
在提示位置附近拷贝插入元素
typename base_type::const_iterator const_iterator
常量迭代器类型
size_type count(const key_type &key) const
统计具有指定键的元素数量
const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
void erase(iterator position) noexcept(noexcept(tree_.erase(position)))
删除指定位置的元素
multimap(const multimap &other)
拷贝构造函数
multimap & operator=(multimap &&other) noexcept(is_nothrow_move_assignable_v< base_type >)
移动赋值运算符
pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
typename base_type::pointer pointer
指针类型
typename base_type::reference reference
引用类型
T data_type
数据类型
iterator emplace(Args &&... args)
在multimap中就地构造元素
void erase(iterator first, iterator last) noexcept(noexcept(tree_.erase(first, last)))
删除指定范围内的元素
const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
void clear() noexcept(noexcept(tree_.clear()))
清空multimap
iterator insert(iterator position, value_type &&value)
在提示位置附近移动插入元素
T mapped_type
映射值类型
size_type size() const noexcept
获取元素数量
size_type max_size() const noexcept
获取最大可能大小
iterator insert(const value_type &value)
拷贝插入元素
bool less_than(const multimap &rhs) const noexcept(noexcept(tree_< rhs.tree_))
小于比较操作符
const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
multimap(Iterator first, Iterator last)
范围构造函数
const_iterator end() const noexcept
获取常量结束迭代器
typename base_type::size_type size_type
大小类型
bool empty() const noexcept
检查是否为空
~multimap()=default
析构函数
typename base_type::iterator iterator
迭代器类型
multimap(Iterator first, Iterator last, const key_compare &comp)
范围构造函数,指定比较函数
const_iterator lower_bound(const key_type &key) const
获取第一个不小于指定键的常量元素位置
multimap & operator=(std::initializer_list< value_type > ilist)
初始化列表赋值运算符
key_compare key_comp() const noexcept
获取键比较函数对象
iterator upper_bound(const key_type &key)
获取第一个大于指定键的元素位置
iterator insert(value_type &&value)
移动插入元素
typename base_type::difference_type difference_type
差值类型
multimap(std::initializer_list< value_type > ilist)
初始化列表构造函数
typename base_type::reverse_iterator reverse_iterator
反向迭代器类型
multimap(std::initializer_list< value_type > ilist, const key_compare &comp)
初始化列表构造函数,指定比较函数
void insert(Iterator first, Iterator last)
范围插入元素
const_iterator begin() const noexcept
获取常量起始迭代器
multimap()
默认构造函数
Key key_type
键类型
value_compare value_comp() const noexcept
获取值比较函数对象
const_iterator cbegin() const noexcept
获取常量起始迭代器
const_iterator cend() const noexcept
获取常量结束迭代器
multimap(multimap &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
typename base_type::allocator_type allocator_type
分配器类型
typename base_type::const_reverse_iterator const_reverse_iterator
常量反向迭代器类型
typename base_type::const_reference const_reference
常量引用类型
multimap & operator=(const multimap &other)
拷贝赋值运算符
void swap(multimap &other) noexcept(is_nothrow_swappable_v< base_type >)
交换两个multimap的内容
红黑树容器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
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)))
移动范围元素
constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
constexpr bool is_allocator_v
is_allocator的便捷变量模板
constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
constexpr bool is_same_v
is_same的便捷变量模板
红黑树容器
集合器接口模板
小于比较仿函数
值比较函数对象
bool operator()(const value_type &lhs, const value_type &rhs) const noexcept
比较两个键值对
存储两个值的元组对
选择pair的第一个元素