1#ifndef NEFORCE_CORE_CONTAINER_SPARSE_MULTIMAP_HPP__
2#define NEFORCE_CORE_CONTAINER_SPARSE_MULTIMAP_HPP__
20NEFORCE_BEGIN_NAMESPACE__
40template <
typename Key,
typename T,
typename Compare = less<Key>,
typename Alloc = allocator<pair<Key, T>>>
44 static_assert(
is_object_v<T>,
"sparse_multimap only contains object types.");
59 struct value_compare {
62 friend class sparse_multimap;
65 explicit value_compare(Compare comp) :
75 return comp_(lhs.first, rhs.first);
119 data_(other.data_) {}
136 data_(_NEFORCE
move(other.data_)) {}
144 data_ = _NEFORCE
move(other.data_);
154 template <
typename Iterator>
157 data_.insert_equal(first, last);
167 template <
typename Iterator>
170 data_.insert_equal(first, last);
195 insert(ilist.begin(), ilist.end());
292 NEFORCE_NODISCARD
bool empty() const noexcept {
return data_.empty(); }
312 template <
typename... Args>
338 template <
typename... Args>
340 return data_.emplace_equal_hint(position, _NEFORCE
forward<Args>(args)...);
358 return data_.insert_equal(position, _NEFORCE
move(value));
367 template <
typename Iterator>
368 void insert(Iterator first, Iterator last) {
369 data_.insert_equal(first, last);
376 void erase(
iterator position)
noexcept(
noexcept(data_.erase(position))) { data_.erase(position); }
390 void erase(
iterator first,
iterator last)
noexcept(
noexcept(data_.erase(first, last))) { data_.erase(first, last); }
395 void clear() noexcept(noexcept(data_.
clear())) { data_.clear(); }
459 return data_.equal_range(key);
491 return data_ == rhs.data_;
500 return data_ < rhs.data_;
504#ifdef NEFORCE_STANDARD_17
505template <
typename Iterator,
typename Compare,
506 typename Alloc = allocator<pair<iter_map_key_t<Iterator>, iter_map_value_t<Iterator>>>>
507sparse_multimap(Iterator, Iterator, Compare = Compare(), Alloc = Alloc())
508 -> sparse_multimap<iter_map_key_t<Iterator>, iter_map_value_t<Iterator>, Compare, Alloc>;
510template <
typename Key,
typename T,
typename Compare = less<Key>,
typename Alloc = allocator<pair<Key, T>>>
511sparse_multimap(std::initializer_list<pair<Key, T>>, Compare = Compare(), Alloc = Alloc())
512 -> sparse_multimap<Key, T, Compare, Alloc>;
514template <
typename Iterator,
typename Alloc>
515sparse_multimap(Iterator, Iterator, Alloc)
516 -> sparse_multimap<iter_map_key_t<Iterator>, iter_map_value_t<Iterator>, less<iter_map_key_t<Iterator>>, Alloc>;
518template <
typename Key,
typename T,
typename Alloc>
519sparse_multimap(std::initializer_list<pair<Key, T>>, Alloc) -> sparse_multimap<Key, T, less<Key>, Alloc>;
524NEFORCE_END_NAMESPACE__
iterator insert(iterator position, value_type &&value)
在提示位置附近移动插入元素
void reserve(size_type n)
预留容量
typename base_type::const_iterator const_iterator
常量迭代器类型
iterator end() noexcept
获取结束迭代器
iterator emplace(Args &&... args)
在sparse_multimap中就地构造元素
const_iterator cbegin() const noexcept
获取常量起始迭代器
typename base_type::const_reference const_reference
常量引用类型
bool less_than(const sparse_multimap &rhs) const noexcept(noexcept(data_< rhs.data_))
小于比较操作符
sparse_multimap(std::initializer_list< value_type > ilist)
初始化列表构造函数
size_type capacity() const noexcept
获取当前容量
const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
const_iterator lower_bound(const key_type &key) const
获取第一个不小于指定键的常量元素位置
typename base_type::reverse_iterator reverse_iterator
反向迭代器类型
typename base_type::pointer pointer
指针类型
iterator emplace_hint(iterator position, Args &&... args)
在提示位置附近就地构造元素
pair< const_iterator, const_iterator > equal_range(const key_type &key) const
获取等于指定键的常量元素范围
sparse_multimap(Iterator first, Iterator last, const key_compare &comp)
范围构造函数,指定比较函数
pair< iterator, iterator > equal_range(const key_type &key)
获取等于指定键的元素范围
sparse_multimap(const key_compare &comp)
构造函数,指定比较函数
size_type erase(const key_type &key) noexcept(noexcept(data_.erase(key)))
删除所有具有指定键的元素
sparse_multimap(sparse_multimap &&other) noexcept(is_nothrow_move_constructible_v< base_type >)
移动构造函数
const_iterator end() const noexcept
获取常量结束迭代器
iterator find(const key_type &key)
查找具有指定键的元素
void erase(iterator first, iterator last) noexcept(noexcept(data_.erase(first, last)))
删除指定范围内的元素
const_iterator find(const key_type &key) const
查找具有指定键的常量元素
void shrink_to_fit()
收缩容量以适应实际大小
typename base_type::const_reverse_iterator const_reverse_iterator
常量反向迭代器类型
key_compare key_comp() const noexcept
获取键比较函数对象
const_iterator begin() const noexcept
获取常量起始迭代器
sparse_multimap(Iterator first, Iterator last)
范围构造函数
size_type count(const key_type &key) const
统计具有指定键的元素数量
bool empty() const noexcept
检查是否为空
typename base_type::iterator iterator
迭代器类型
reverse_iterator rend() noexcept
获取反向结束迭代器
sparse_multimap & operator=(const sparse_multimap &other)
拷贝赋值运算符
iterator upper_bound(const key_type &key)
获取第一个大于指定键的元素位置
~sparse_multimap()=default
析构函数
void clear() noexcept(noexcept(data_.clear()))
清空sparse_multimap
size_type max_size() const noexcept
获取最大可能大小
const_iterator upper_bound(const key_type &key) const
获取第一个大于指定键的常量元素位置
sparse_multimap(std::initializer_list< value_type > ilist, const key_compare &comp)
初始化列表构造函数,指定比较函数
iterator begin() noexcept
获取起始迭代器
const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
void erase(iterator position) noexcept(noexcept(data_.erase(position)))
删除指定位置的元素
sparse_multimap(const sparse_multimap &other)
拷贝构造函数
void swap(sparse_multimap &other) noexcept(is_nothrow_swappable_v< base_type >)
交换两个sparse_multimap的内容
reverse_iterator rbegin() noexcept
获取反向起始迭代器
const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
size_type size() const noexcept
获取元素数量
typename base_type::reference reference
引用类型
const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
void insert(Iterator first, Iterator last)
范围插入元素
typename base_type::size_type size_type
大小类型
typename base_type::const_pointer const_pointer
常量指针类型
typename base_type::difference_type difference_type
差值类型
sparse_multimap & operator=(std::initializer_list< value_type > ilist)
初始化列表赋值运算符
Compare key_compare
键比较函数类型
iterator lower_bound(const key_type &key)
获取第一个不小于指定键的元素位置
typename base_type::allocator_type allocator_type
分配器类型
bool equal_to(const sparse_multimap &rhs) const noexcept(noexcept(data_==rhs.data_))
相等比较操作符
const_iterator cend() const noexcept
获取常量结束迭代器
iterator insert(iterator position, const value_type &value)
在提示位置附近拷贝插入元素
iterator insert(value_type &&value)
移动插入元素
value_compare value_comp() const noexcept
获取值比较函数对象
sparse_multimap & operator=(sparse_multimap &&other) noexcept(is_nothrow_move_assignable_v< base_type >)
移动赋值运算符
pair< Key, T > value_type
值类型
iterator insert(const value_type &value)
拷贝插入元素
sparse_vector_iterator< true, sparse_vector > const_iterator
sparse_vector_iterator< false, sparse_vector > iterator
const pair< Key, T > & const_reference
_NEFORCE reverse_iterator< iterator > reverse_iterator
const pair< Key, T > * const_pointer
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
pair< Key, T > & reference
ptrdiff_t difference_type
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的便捷变量模板
bool operator()(const value_type &lhs, const value_type &rhs) const noexcept
比较两个键值对