1#ifndef NEFORCE_CORE_CONTAINER_MAP_HPP__
2#define NEFORCE_CORE_CONTAINER_MAP_HPP__
15NEFORCE_BEGIN_NAMESPACE__
35template <
typename Key,
typename T,
typename Compare = less<Key>,
36 typename Alloc = allocator<rb_tree_node<pair<const Key, T>>>>
55 struct value_compare {
61 explicit value_compare(Compare comp) :
71 return comp_(lhs.first, rhs.first);
116 tree_(other.tree_) {}
136 tree_(_NEFORCE
move(other.tree_)) {}
147 tree_ = _NEFORCE
move(other.tree_);
157 template <
typename Iterator>
158 map(Iterator first, Iterator last) :
160 tree_.insert_unique(first, last);
169 template <
typename Iterator>
172 tree_.insert_unique(first, last);
179 map(std::initializer_list<value_type> ilist) :
197 insert(ilist.begin(), ilist.end());
294 NEFORCE_NODISCARD
bool empty() const noexcept {
return tree_.empty(); }
314 template <
typename... Args>
316 return tree_.emplace_unique(_NEFORCE
forward<Args>(args)...);
340 template <
typename... Args>
342 return tree_.emplace_unique_hint(position, _NEFORCE
forward<Args>(args)...);
360 return tree_.insert_unique(position, _NEFORCE
move(value));
369 template <
typename Iterator>
370 void insert(Iterator first, Iterator last) {
371 tree_.insert_unique(first, last);
378 void erase(
iterator position)
noexcept(
noexcept(tree_.erase(position))) { tree_.erase(position); }
392 void erase(
iterator first,
iterator last)
noexcept(
noexcept(tree_.erase(first, last))) { tree_.erase(first, last); }
397 void clear() noexcept(noexcept(tree_.
clear())) { tree_.clear(); }
461 return tree_.equal_range(key);
472 iterator iter = tree_.lower_bound(key);
473 if (iter ==
end() ||
key_comp()(key, iter->first)) {
474 iter = tree_.emplace_unique_hint(iter, key,
initialize<T>());
487 iterator iter = tree_.lower_bound(key);
488 if (iter ==
end() ||
key_comp()(key, iter->first)) {
502 if (iter ==
end() &&
key_comp()(iter->first, key)) {
503 NEFORCE_THROW_EXCEPTION(
value_exception(
"the value of this key does not exists."));
515 iterator iter = tree_.lower_bound(key);
516 if (iter ==
end() &&
key_comp()(iter->first, key)) {
517 NEFORCE_THROW_EXCEPTION(
value_exception(
"the value of this key does not exists."));
526 void swap(
map& other)
noexcept(
noexcept(tree_.swap(other.tree_))) { tree_.swap(other.tree_); }
533 NEFORCE_NODISCARD
bool equal_to(
const map& rhs)
const noexcept(
noexcept(tree_ == rhs.tree_)) {
534 return tree_ == rhs.tree_;
542 NEFORCE_NODISCARD
bool less_than(
const map& rhs)
const noexcept(
noexcept(tree_ < rhs.tree_)) {
543 return tree_ < rhs.tree_;
547#ifdef NEFORCE_STANDARD_17
548template <
typename Iterator,
typename Compare,
550map(Iterator, Iterator, Compare = Compare(), Alloc = Alloc())
553template <
typename Key,
typename T,
typename Compare = less<Key>,
typename Alloc = allocator<pair<const Key, T>>>
556template <
typename Iterator,
typename Alloc>
557map(Iterator, Iterator, Alloc)
560template <
typename Key,
typename T,
typename Alloc>
566NEFORCE_END_NAMESPACE__
typename base_type::iterator iterator
迭代器类型
map(const key_compare &comp)
构造函数,指定比较函数
const mapped_type & at(const key_type &key) const
带边界检查的常量访问
const_iterator lower_bound(const key_type &key) const
获取第一个不小于指定键的常量元素位置
map(const map &other)
拷贝构造函数
bool less_than(const map &rhs) const noexcept(noexcept(tree_< rhs.tree_))
小于比较操作符
iterator end() noexcept
获取结束迭代器
map & operator=(std::initializer_list< value_type > ilist)
初始化列表赋值运算符
map(map &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
size_type count(const key_type &key) const
统计具有指定键的元素数量
const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
mapped_type & operator[](key_type &&key)
右值键下标访问操作符
typename base_type::const_reverse_iterator const_reverse_iterator
常量反向迭代器类型
const_iterator begin() const noexcept
获取常量起始迭代器
void swap(map &other) noexcept(noexcept(tree_.swap(other.tree_)))
交换两个map的内容
iterator upper_bound(const key_type &key)
获取第一个大于指定键的元素位置
key_compare key_comp() const noexcept
获取键比较函数对象
bool empty() const noexcept
获取元素数量
typename base_type::pointer pointer
指针类型
iterator insert(iterator position, const value_type &value)
在提示位置附近拷贝插入元素
value_compare value_comp() const noexcept
获取值比较函数对象
pair< iterator, bool > insert(value_type &&value)
移动插入元素
map(std::initializer_list< value_type > ilist)
初始化列表构造函数
typename base_type::allocator_type allocator_type
分配器类型
const_iterator end() const noexcept
获取常量结束迭代器
const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
iterator begin() noexcept
获取起始迭代器
size_type erase(const key_type &key) noexcept(noexcept(tree_.erase(key)))
删除所有具有指定键的元素
size_type max_size() 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)
范围构造函数
pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
size_type size() const noexcept
获取元素数量
typename base_type::const_iterator const_iterator
常量迭代器类型
void erase(iterator position) noexcept(noexcept(tree_.erase(position)))
删除指定位置的元素
typename base_type::reverse_iterator reverse_iterator
反向迭代器类型
const_iterator cbegin() const noexcept
获取常量起始迭代器
bool equal_to(const map &rhs) const noexcept(noexcept(tree_==rhs.tree_))
相等比较操作符
const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
mapped_type & at(const key_type &key)
带边界检查的访问
reverse_iterator rend() noexcept
获取反向结束迭代器
Compare key_compare
键比较函数类型
mapped_type & operator[](const key_type &key)
下标访问操作符
reverse_iterator rbegin() noexcept
获取反向起始迭代器
map & operator=(const map &other)
拷贝赋值运算符
pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
typename base_type::difference_type difference_type
差值类型
const_iterator find(const key_type &key) const
常量查找具有指定键的元素
iterator emplace_hint(iterator position, Args &&... args)
在提示位置附近就地构造元素
typename base_type::const_pointer const_pointer
常量指针类型
map(std::initializer_list< value_type > ilist, const key_compare &comp)
初始化列表构造函数,指定比较函数
pair< const Key, T > value_type
值类型
const_iterator cend() const noexcept
获取常量结束迭代器
iterator lower_bound(const key_type &key)
获取第一个不小于指定键的元素位置
pair< iterator, bool > emplace(Args &&... args)
构造元素
const_iterator upper_bound(const key_type &key) const
获取第一个大于指定键的常量元素位置
typename base_type::const_reference const_reference
常量引用类型
typename base_type::size_type size_type
大小类型
void insert(Iterator first, Iterator last)
范围插入元素
typename base_type::reference reference
引用类型
iterator find(const key_type &key)
查找具有指定键的元素
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 reverse_iterator< const_iterator > const_reverse_iterator
const pair< const Key, T > & const_reference
_NEFORCE reverse_iterator< iterator > reverse_iterator
rb_tree_iterator< true, rb_tree > const_iterator
ptrdiff_t difference_type
rb_tree_iterator< false, rb_tree > iterator
const pair< const Key, T > * const_pointer
pair< const Key, T > & reference
pair< const Key, T > * pointer
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr T * addressof(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_allocator_v
is_allocator的便捷变量模板
constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
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
比较两个键值对