NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
sparse_multiset.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_SPARSE_MULTISET_HPP__
2#define NEFORCE_CORE_CONTAINER_SPARSE_MULTISET_HPP__
3
13
15NEFORCE_BEGIN_NAMESPACE__
16
22
37template <typename Key, typename Compare = less<Key>, typename Alloc = allocator<Key>>
38class sparse_multiset : icollector<sparse_multiset<Key, Compare, Alloc>> {
39 static_assert(is_allocator_v<Alloc>, "Alloc type is not a standard allocator type.");
40 static_assert(is_same_v<Key, typename Alloc::value_type>, "allocator type mismatch.");
41 static_assert(is_object_v<Key>, "sparse_multiset only contains object types.");
42
43public:
44 using key_type = Key;
45 using value_type = Key;
46 using key_compare = Compare;
47 using value_compare = Compare;
48
49private:
50 using base_type = sparse_vector<Key, Key, identity<Key>, Compare, Alloc>;
51
52public:
55 using pointer = typename base_type::pointer;
59 using iterator = typename base_type::iterator;
64
65private:
66 base_type data_;
67
68public:
75 data_(Compare()) {}
76
81 explicit sparse_multiset(const key_compare& comp) :
82 data_(comp) {}
83
89 data_(other.data_) {}
90
97 data_ = other.data_;
98 return *this;
99 }
100
106 data_(_NEFORCE move(other.data_)) {}
107
114 data_ = _NEFORCE move(other.data_);
115 return *this;
116 }
117
124 template <typename Iterator>
125 sparse_multiset(Iterator first, Iterator last) :
126 data_(Compare()) {
127 data_.insert_equal(first, last);
128 }
129
137 template <typename Iterator>
138 sparse_multiset(Iterator first, Iterator last, const key_compare& comp) :
139 data_(comp) {
140 data_.insert_equal(first, last);
141 }
142
147 sparse_multiset(std::initializer_list<value_type> ilist) :
148 sparse_multiset(ilist.begin(), ilist.end()) {}
149
155 sparse_multiset(std::initializer_list<value_type> ilist, const key_compare& comp) :
156 sparse_multiset(ilist.begin(), ilist.end(), comp) {}
157
163 sparse_multiset& operator=(std::initializer_list<value_type> ilist) {
164 clear();
165 insert(ilist.begin(), ilist.end());
166 return *this;
167 }
168
172 ~sparse_multiset() = default;
173
178 NEFORCE_NODISCARD iterator begin() noexcept { return data_.begin(); }
179
184 NEFORCE_NODISCARD iterator end() noexcept { return data_.end(); }
185
190 NEFORCE_NODISCARD const_iterator begin() const noexcept { return data_.cbegin(); }
191
196 NEFORCE_NODISCARD const_iterator end() const noexcept { return data_.cend(); }
197
202 NEFORCE_NODISCARD const_iterator cbegin() const noexcept { return data_.cbegin(); }
203
208 NEFORCE_NODISCARD const_iterator cend() const noexcept { return data_.cend(); }
209
214 NEFORCE_NODISCARD reverse_iterator rbegin() noexcept { return reverse_iterator(data_.end()); }
215
220 NEFORCE_NODISCARD reverse_iterator rend() noexcept { return reverse_iterator(data_.begin()); }
221
226 NEFORCE_NODISCARD const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(data_.cend()); }
227
232 NEFORCE_NODISCARD const_reverse_iterator rend() const noexcept { return const_reverse_iterator(data_.cbegin()); }
233
238 NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(data_.cend()); }
239
244 NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept { return const_reverse_iterator(data_.cbegin()); }
245
250 NEFORCE_NODISCARD size_type size() const noexcept { return data_.size(); }
251
256 NEFORCE_NODISCARD size_type max_size() const noexcept { return data_.max_size(); }
257
262 NEFORCE_NODISCARD bool empty() const noexcept { return data_.empty(); }
263
268 NEFORCE_NODISCARD key_compare key_comp() const noexcept { return data_.key_compare(); }
269
274 NEFORCE_NODISCARD value_compare value_comp() const noexcept { return value_compare(data_.key_compare()); }
275
282 template <typename... Args>
283 iterator emplace(Args&&... args) {
284 return data_.emplace_equal(_NEFORCE forward<Args>(args)...);
285 }
286
292 iterator insert(const value_type& value) { return data_.insert_equal(value); }
293
299 iterator insert(value_type&& value) { return data_.insert_equal(_NEFORCE move(value)); }
300
308 template <typename... Args>
309 iterator emplace_hint(iterator position, Args&&... args) {
310 return data_.emplace_equal_hint(position, _NEFORCE forward<Args>(args)...);
311 }
312
319 iterator insert(iterator position, const value_type& value) { return data_.insert_equal(position, value); }
320
327 iterator insert(iterator position, value_type&& value) {
328 return data_.insert_equal(position, _NEFORCE move(value));
329 }
330
337 template <typename Iterator>
338 void insert(Iterator first, Iterator last) {
339 data_.insert_equal(first, last);
340 }
341
346 void erase(iterator position) noexcept(noexcept(data_.erase(position))) { data_.erase(position); }
347
353 size_type erase(const key_type& key) noexcept(noexcept(data_.erase(key))) { return data_.erase(key); }
354
360 void erase(iterator first, iterator last) noexcept(noexcept(data_.erase(first, last))) { data_.erase(first, last); }
361
365 void clear() noexcept(noexcept(data_.clear())) { data_.clear(); }
366
372 NEFORCE_NODISCARD iterator find(const key_type& key) { return data_.find(key); }
373
379 NEFORCE_NODISCARD const_iterator find(const key_type& key) const { return data_.find(key); }
380
386 NEFORCE_NODISCARD size_type count(const key_type& key) const { return data_.count(key); }
387
393 NEFORCE_NODISCARD iterator lower_bound(const key_type& key) { return data_.lower_bound(key); }
394
400 NEFORCE_NODISCARD const_iterator lower_bound(const key_type& key) const { return data_.lower_bound(key); }
401
407 NEFORCE_NODISCARD iterator upper_bound(const key_type& key) { return data_.upper_bound(key); }
408
414 NEFORCE_NODISCARD const_iterator upper_bound(const key_type& key) const { return data_.upper_bound(key); }
415
421 NEFORCE_NODISCARD pair<iterator, iterator> equal_range(const key_type& key) { return data_.equal_range(key); }
422
428 NEFORCE_NODISCARD pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
429 return data_.equal_range(key);
430 }
431
436 void reserve(size_type n) { data_.reserve(n); }
437
442 NEFORCE_NODISCARD size_type capacity() const noexcept { return data_.capacity(); }
443
447 void shrink_to_fit() { data_.shrink_to_fit(); }
448
453 void swap(sparse_multiset& other) noexcept(is_nothrow_swappable_v<base_type>) { data_.swap(other.data_); }
454
460 NEFORCE_NODISCARD bool equal_to(const sparse_multiset& rhs) const noexcept(noexcept(data_ == rhs.data_)) {
461 return data_ == rhs.data_;
462 }
463
469 NEFORCE_NODISCARD bool less_than(const sparse_multiset& rhs) const noexcept(noexcept(data_ < rhs.data_)) {
470 return data_ < rhs.data_;
471 }
472};
473
474#ifdef NEFORCE_STANDARD_17
475template <typename Iterator, typename Compare = less<iter_value_t<Iterator>>,
476 typename Alloc = allocator<iter_value_t<Iterator>>>
477sparse_multiset(Iterator, Iterator, Compare = Compare(), Alloc = Alloc())
478 -> sparse_multiset<iter_value_t<Iterator>, Compare, Alloc>;
479
480template <typename Key, typename Compare = less<Key>, typename Alloc = allocator<Key>>
481sparse_multiset(std::initializer_list<Key>, Compare = Compare(), Alloc = Alloc())
482 -> sparse_multiset<Key, Compare, Alloc>;
483
484template <typename Iterator, typename Alloc>
485sparse_multiset(Iterator, Iterator, Alloc)
486 -> sparse_multiset<iter_value_t<Iterator>, less<iter_value_t<Iterator>>, Alloc>;
487
488template <typename Key, typename Alloc>
489sparse_multiset(std::initializer_list<Key>, Alloc) -> sparse_multiset<Key, less<Key>, Alloc>;
490#endif
491 // Container
493
494NEFORCE_END_NAMESPACE__
495#endif // NEFORCE_CORE_CONTAINER_SPARSE_MULTISET_HPP__
void erase(iterator first, iterator last) noexcept(noexcept(data_.erase(first, last)))
删除指定范围内的元素
~sparse_multiset()=default
析构函数
sparse_multiset(const key_compare &comp)
构造函数,指定比较函数
typename base_type::const_pointer const_pointer
常量指针类型
const_iterator cend() const noexcept
获取常量结束迭代器
const_iterator end() const noexcept
获取常量结束迭代器
iterator begin() noexcept
获取起始迭代器
Compare key_compare
键比较函数类型
typename base_type::difference_type difference_type
差值类型
size_type capacity() const noexcept
获取当前容量
sparse_multiset(const sparse_multiset &other)
拷贝构造函数
size_type size() const noexcept
获取元素数量
void insert(Iterator first, Iterator last)
范围插入元素
iterator emplace(Args &&... args)
在sparse_multiset中就地构造元素
iterator insert(value_type &&value)
移动插入元素
sparse_multiset()
默认构造函数
void swap(sparse_multiset &other) noexcept(is_nothrow_swappable_v< base_type >)
交换两个sparse_multiset的内容
bool empty() const noexcept
检查是否为空
sparse_multiset(Iterator first, Iterator last)
范围构造函数
size_type erase(const key_type &key) noexcept(noexcept(data_.erase(key)))
删除所有具有指定键的元素
typename base_type::const_iterator const_iterator
常量迭代器类型
iterator insert(iterator position, const value_type &value)
在提示位置附近拷贝插入元素
typename base_type::size_type size_type
大小类型
typename base_type::pointer pointer
指针类型
const_iterator upper_bound(const key_type &key) const
获取第一个大于指定键的常量元素位置
const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
Compare value_compare
值比较函数类型
sparse_multiset & operator=(sparse_multiset &&other) noexcept(is_nothrow_move_assignable_v< base_type >)
移动赋值运算符
typename base_type::allocator_type allocator_type
分配器类型
iterator insert(iterator position, value_type &&value)
在提示位置附近移动插入元素
const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
size_type count(const key_type &key) const
统计具有指定键的元素数量
const_iterator find(const key_type &key) const
查找具有指定键的元素(常量版本)
bool equal_to(const sparse_multiset &rhs) const noexcept(noexcept(data_==rhs.data_))
相等比较操作符
typename base_type::iterator iterator
迭代器类型
void erase(iterator position) noexcept(noexcept(data_.erase(position)))
删除指定位置的元素
sparse_multiset & operator=(std::initializer_list< value_type > ilist)
初始化列表赋值运算符
pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
const_iterator lower_bound(const key_type &key) const
获取第一个不小于指定键的常量元素位置
typename base_type::reference reference
引用类型
const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
key_compare key_comp() const noexcept
获取键比较函数对象
bool less_than(const sparse_multiset &rhs) const noexcept(noexcept(data_< rhs.data_))
小于比较操作符
sparse_multiset(std::initializer_list< value_type > ilist, const key_compare &comp)
初始化列表构造函数,指定比较函数
iterator find(const key_type &key)
查找具有指定键的元素
iterator end() noexcept
获取结束迭代器
sparse_multiset(std::initializer_list< value_type > ilist)
初始化列表构造函数
const_iterator begin() const noexcept
获取常量起始迭代器
iterator upper_bound(const key_type &key)
获取第一个大于指定键的元素位置
sparse_multiset(sparse_multiset &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
typename base_type::const_reference const_reference
常量引用类型
reverse_iterator rend() noexcept
获取反向结束迭代器
typename base_type::reverse_iterator reverse_iterator
反向迭代器类型
iterator lower_bound(const key_type &key)
获取第一个不小于指定键的元素位置
value_compare value_comp() const noexcept
获取值比较函数对象
pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
void clear() noexcept(noexcept(data_.clear()))
清空sparse_multiset
void reserve(size_type n)
预留容量
iterator insert(const value_type &value)
拷贝插入元素
reverse_iterator rbegin() noexcept
获取反向起始迭代器
sparse_multiset & operator=(const sparse_multiset &other)
拷贝赋值运算符
void shrink_to_fit()
收缩容量以适应实际大小
const_iterator cbegin() const noexcept
获取常量起始迭代器
iterator emplace_hint(iterator position, Args &&... args)
在提示位置附近就地构造元素
size_type max_size() const noexcept
获取最大可能大小
sparse_multiset(Iterator first, Iterator last, const key_compare &comp)
范围构造函数,指定比较函数
typename base_type::const_reverse_iterator const_reverse_iterator
常量反向迭代器类型
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr bool is_object_v
is_object的便捷变量模板
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的便捷变量模板
constexpr bool is_same_v
is_same的便捷变量模板
稀疏向量容器
集合器接口模板
存储两个值的元组对