NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
container/set.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_SET_HPP__
2#define NEFORCE_CORE_CONTAINER_SET_HPP__
3
13
15NEFORCE_BEGIN_NAMESPACE__
16
22
34template <typename Key, typename Compare = less<Key>, typename Alloc = allocator<rb_tree_node<Key>>>
35class set : public icollector<set<Key, Compare, Alloc>> {
36 static_assert(is_allocator_v<Alloc>, "Alloc type is not a standard allocator type.");
37 static_assert(is_same_v<rb_tree_node<Key>, typename Alloc::value_type>, "allocator type mismatch.");
38 static_assert(is_object_v<Key>, "set only contains object types.");
39
40public:
41 using key_type = Key;
42 using value_type = Key;
43 using key_compare = Compare;
44 using value_compare = Compare;
45
46private:
47 using base_type = rb_tree<Key, Key, identity<Key>, Compare, Alloc>;
48
49public:
52 using pointer = typename base_type::pointer;
56 using iterator = typename base_type::iterator;
61
62private:
63 base_type tree_;
64
65public:
71 set() :
72 tree_(Compare()) {}
73
78 explicit set(const key_compare& comp) :
79 tree_(comp) {}
80
85 set(const set& other) :
86 tree_(other.tree_) {}
87
93 set& operator=(const set& other) {
94 tree_ = other.tree_;
95 return *this;
96 }
97
103 tree_(_NEFORCE move(other.tree_)) {}
104
111 tree_.clear();
112 tree_.swap(other.tree_);
113 return *this;
114 }
115
122 template <typename Iterator>
123 set(Iterator first, Iterator last) :
124 tree_(Compare()) {
125 tree_.insert_unique(first, last);
126 }
127
135 template <typename Iterator>
136 set(Iterator first, Iterator last, const key_compare& comp) :
137 tree_(comp) {
138 tree_.insert_unique(first, last);
139 }
140
145 set(std::initializer_list<value_type> ilist) :
146 set(ilist.begin(), ilist.end()) {}
147
153 set(std::initializer_list<value_type> ilist, const key_compare& comp) :
154 set(ilist.begin(), ilist.end(), comp) {}
155
161 set& operator=(std::initializer_list<value_type> ilist) {
162 clear();
163 insert(ilist.begin(), ilist.end());
164 return *this;
165 }
166
170 ~set() = default;
171
176 NEFORCE_NODISCARD iterator begin() noexcept { return tree_.begin(); }
177
182 NEFORCE_NODISCARD iterator end() noexcept { return tree_.end(); }
183
188 NEFORCE_NODISCARD const_iterator cbegin() const noexcept { return tree_.cbegin(); }
189
194 NEFORCE_NODISCARD const_iterator cend() const noexcept { return tree_.cend(); }
195
200 NEFORCE_NODISCARD reverse_iterator rbegin() noexcept { return tree_.rbegin(); }
201
206 NEFORCE_NODISCARD reverse_iterator rend() noexcept { return tree_.rend(); }
207
212 NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept { return tree_.crbegin(); }
213
218 NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept { return tree_.crend(); }
219
224 NEFORCE_NODISCARD size_type size() const noexcept { return tree_.size(); }
225
230 NEFORCE_NODISCARD size_type max_size() const noexcept { return tree_.max_size(); }
231
236 NEFORCE_NODISCARD bool empty() const noexcept { return tree_.empty(); }
237
242 NEFORCE_NODISCARD key_compare key_comp() const noexcept { return tree_.key_comp(); }
243
248 NEFORCE_NODISCARD value_compare value_comp() const noexcept { return value_compare(tree_.key_comp()); }
249
256 template <typename... Args>
258 return tree_.emplace_unique(_NEFORCE forward<Args>(args)...);
259 }
260
266 pair<iterator, bool> insert(const value_type& value) { return tree_.insert_unique(value); }
267
273 pair<iterator, bool> insert(value_type&& value) { return tree_.insert_unique(_NEFORCE move(value)); }
274
282 template <typename... Args>
283 iterator emplace_hint(iterator position, Args&&... args) {
284 return tree_.emplace_unique_hint(position, _NEFORCE forward<Args>(args)...);
285 }
286
293 iterator insert(iterator position, const value_type& value) { return tree_.insert_unique(position, value); }
294
301 iterator insert(iterator position, value_type&& value) {
302 return tree_.insert_unique(position, _NEFORCE move(value));
303 }
304
311 template <typename Iterator>
312 void insert(Iterator first, Iterator last) {
313 tree_.insert_unique(first, last);
314 }
315
320 void erase(iterator position) noexcept(noexcept(tree_.erase(position))) { tree_.erase(position); }
321
327 size_type erase(const key_type& key) noexcept(noexcept(tree_.erase(key))) { return tree_.erase(key); }
328
334 void erase(iterator first, iterator last) noexcept(noexcept(tree_.erase(first, last))) { tree_.erase(first, last); }
335
339 void clear() noexcept(noexcept(tree_.clear())) { tree_.clear(); }
340
346 NEFORCE_NODISCARD iterator find(const key_type& key) { return tree_.find(key); }
347
353 NEFORCE_NODISCARD const_iterator find(const key_type& key) const { return tree_.find(key); }
354
360 NEFORCE_NODISCARD size_type count(const key_type& key) const { return tree_.count(key); }
361
367 NEFORCE_NODISCARD iterator lower_bound(const key_type& key) { return tree_.lower_bound(key); }
368
374 NEFORCE_NODISCARD const_iterator lower_bound(const key_type& key) const { return tree_.lower_bound(key); }
375
381 NEFORCE_NODISCARD iterator upper_bound(const key_type& key) { return tree_.upper_bound(key); }
382
388 NEFORCE_NODISCARD const_iterator upper_bound(const key_type& key) const { return tree_.upper_bound(key); }
389
395 NEFORCE_NODISCARD pair<iterator, iterator> equal_range(const key_type& key) { return tree_.equal_range(key); }
396
402 NEFORCE_NODISCARD pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
403 return tree_.equal_range(key);
404 }
405
410 void swap(set& other) noexcept(noexcept(tree_.swap(other.tree_))) { tree_.swap(other.tree_); }
411
417 NEFORCE_NODISCARD bool operator==(const set& rhs) const noexcept(noexcept(tree_ == rhs.tree_)) {
418 return tree_ == rhs.tree_;
419 }
420
426 NEFORCE_NODISCARD bool operator<(const set& rhs) const noexcept(noexcept(tree_ < rhs.tree_)) {
427 return tree_ < rhs.tree_;
428 }
429};
430
431#ifdef NEFORCE_STANDARD_17
432template <typename Iterator, typename Compare = less<iter_value_t<Iterator>>,
433 typename Alloc = allocator<iter_value_t<Iterator>>>
434set(Iterator, Iterator, Compare = Compare(), Alloc = Alloc()) -> set<iter_value_t<Iterator>, Compare, Alloc>;
435
436template <typename Key, typename Compare = less<Key>, typename Alloc = allocator<Key>>
437set(std::initializer_list<Key>, Compare = Compare(), Alloc = Alloc()) -> set<Key, Compare, Alloc>;
438
439template <typename Iterator, typename Alloc>
440set(Iterator, Iterator, Alloc) -> set<iter_value_t<Iterator>, less<iter_value_t<Iterator>>, Alloc>;
441
442template <typename Key, typename Alloc>
443set(std::initializer_list<Key>, Alloc) -> set<Key, less<Key>, Alloc>;
444#endif
445 // Container
447
448NEFORCE_END_NAMESPACE__
449#endif // NEFORCE_CORE_CONTAINER_SET_HPP__
红黑树容器
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
_NEFORCE reverse_iterator< iterator > reverse_iterator
集合容器
iterator insert(iterator position, value_type &&value)
在提示位置附近移动插入元素
typename base_type::const_reverse_iterator const_reverse_iterator
常量反向迭代器类型
NEFORCE_NODISCARD const_iterator cend() const noexcept
获取常量结束迭代器
NEFORCE_NODISCARD size_type size() const noexcept
获取元素数量
set(std::initializer_list< value_type > ilist, const key_compare &comp)
初始化列表构造函数,指定比较函数
typename base_type::reference reference
引用类型
NEFORCE_NODISCARD iterator lower_bound(const key_type &key)
获取第一个不小于指定键的元素位置
~set()=default
析构函数
Compare value_compare
值比较函数类型
iterator emplace_hint(iterator position, Args &&... args)
在提示位置附近就地构造元素
set(Iterator first, Iterator last, const key_compare &comp)
范围构造函数,指定比较函数
typename base_type::size_type size_type
大小类型
typename base_type::const_iterator const_iterator
常量迭代器类型
size_type erase(const key_type &key) noexcept(noexcept(tree_.erase(key)))
删除所有具有指定键的元素
typename base_type::difference_type difference_type
差值类型
typename base_type::const_reference const_reference
常量引用类型
NEFORCE_NODISCARD pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
NEFORCE_NODISCARD bool empty() const noexcept
检查是否为空
Compare key_compare
键比较函数类型
set()
默认构造函数
NEFORCE_NODISCARD const_iterator upper_bound(const key_type &key) const
获取第一个大于指定键的常量元素位置
NEFORCE_NODISCARD bool operator==(const set &rhs) const noexcept(noexcept(tree_==rhs.tree_))
相等比较操作符
typename base_type::const_pointer const_pointer
常量指针类型
void swap(set &other) noexcept(noexcept(tree_.swap(other.tree_)))
交换两个set的内容
NEFORCE_NODISCARD size_type max_size() const noexcept
获取最大可能大小
void erase(iterator first, iterator last) noexcept(noexcept(tree_.erase(first, last)))
删除指定范围内的元素
Key key_type
键类型
iterator insert(iterator position, const value_type &value)
在提示位置附近拷贝插入元素
NEFORCE_NODISCARD pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
NEFORCE_NODISCARD bool operator<(const set &rhs) const noexcept(noexcept(tree_< rhs.tree_))
小于比较操作符
pair< iterator, bool > emplace(Args &&... args)
在set中就地构造元素
typename base_type::iterator iterator
迭代器类型
NEFORCE_NODISCARD key_compare key_comp() const noexcept
获取键比较函数对象
NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
set & operator=(std::initializer_list< value_type > ilist)
初始化列表赋值运算符
typename base_type::pointer pointer
指针类型
set(Iterator first, Iterator last)
范围构造函数
set(const set &other)
拷贝构造函数
set(set &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
Key value_type
值类型
set & operator=(const set &other)
拷贝赋值运算符
set & operator=(set &&other) noexcept(is_nothrow_swappable_v< base_type >)
移动赋值运算符
pair< iterator, bool > insert(const value_type &value)
拷贝插入元素
void clear() noexcept(noexcept(tree_.clear()))
清空set
void insert(Iterator first, Iterator last)
范围插入元素
set(std::initializer_list< value_type > ilist)
初始化列表构造函数
NEFORCE_NODISCARD value_compare value_comp() const noexcept
获取值比较函数对象
NEFORCE_NODISCARD size_type count(const key_type &key) const
统计具有指定键的元素数量
pair< iterator, bool > insert(value_type &&value)
移动插入元素
NEFORCE_NODISCARD const_iterator lower_bound(const key_type &key) const
获取第一个不小于指定键的常量元素位置
NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD iterator begin() noexcept
获取起始迭代器
NEFORCE_NODISCARD reverse_iterator rbegin() noexcept
获取反向起始迭代器
NEFORCE_NODISCARD iterator end() noexcept
获取结束迭代器
set(const key_compare &comp)
构造函数,指定比较函数
NEFORCE_NODISCARD iterator upper_bound(const key_type &key)
获取第一个大于指定键的元素位置
typename base_type::allocator_type allocator_type
分配器类型
NEFORCE_NODISCARD iterator find(const key_type &key)
查找具有指定键的元素
NEFORCE_NODISCARD reverse_iterator rend() noexcept
获取反向结束迭代器
void erase(iterator position) noexcept(noexcept(tree_.erase(position)))
删除指定位置的元素
NEFORCE_NODISCARD const_iterator cbegin() const noexcept
获取常量起始迭代器
typename base_type::reverse_iterator reverse_iterator
反向迭代器类型
NEFORCE_NODISCARD const_iterator find(const key_type &key) const
查找具有指定键的常量元素
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
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_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
红黑树容器
集合器接口模板
小于比较仿函数
存储两个值的元组对