56 #ifndef _STL_MULTIMAP_H 
   57 #define _STL_MULTIMAP_H 1 
   60 #if __cplusplus >= 201103L 
   64 namespace std _GLIBCXX_VISIBILITY(default)
 
   66 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
   92   template <
typename _Key, 
typename _Tp,
 
   98       typedef _Key                                          key_type;
 
   99       typedef _Tp                                           mapped_type;
 
  101       typedef _Compare                                      key_compare;
 
  102       typedef _Alloc                                        allocator_type;
 
  106       typedef typename _Alloc::value_type                   _Alloc_value_type;
 
  107       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
 
  108       __glibcxx_class_requires4(_Compare, 
bool, _Key, _Key,
 
  109                 _BinaryFunctionConcept)
 
  110       __glibcxx_class_requires2(
value_type, _Alloc_value_type, _SameTypeConcept)
 
  116     friend class multimap<_Key, _Tp, _Compare, _Alloc>;
 
  120     value_compare(_Compare __c)
 
  131     rebind<value_type>::other _Pair_alloc_type;
 
  133       typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
 
  134                key_compare, _Pair_alloc_type> _Rep_type;
 
  143       typedef typename _Alloc_traits::pointer            pointer;
 
  144       typedef typename _Alloc_traits::const_pointer      const_pointer;
 
  145       typedef typename _Alloc_traits::reference          reference;
 
  146       typedef typename _Alloc_traits::const_reference    const_reference;
 
  147       typedef typename _Rep_type::iterator               iterator;
 
  148       typedef typename _Rep_type::const_iterator         const_iterator;
 
  149       typedef typename _Rep_type::size_type              size_type;
 
  150       typedef typename _Rep_type::difference_type        difference_type;
 
  169            const allocator_type& __a = allocator_type())
 
  170       : _M_t(__comp, _Pair_alloc_type(__a)) { }
 
  182 #if __cplusplus >= 201103L 
  191       noexcept(is_nothrow_copy_constructible<_Compare>::value)
 
  192       : _M_t(std::move(__x._M_t)) { }
 
  205            const _Compare& __comp = _Compare(),
 
  206            const allocator_type& __a = allocator_type())
 
  207       : _M_t(__comp, _Pair_alloc_type(__a))
 
  208       { _M_t._M_insert_equal(__l.begin(), __l.end()); }
 
  213       : _M_t(_Compare(), _Pair_alloc_type(__a)) { }
 
  217       : _M_t(__m._M_t, _Pair_alloc_type(__a)) { }
 
  221       noexcept(is_nothrow_copy_constructible<_Compare>::value
 
  223       : _M_t(std::move(__m._M_t), _Pair_alloc_type(__a)) { }
 
  227       : _M_t(_Compare(), _Pair_alloc_type(__a))
 
  228       { _M_t._M_insert_equal(__l.begin(), __l.end()); }
 
  231       template<
typename _InputIterator>
 
  232         multimap(_InputIterator __first, _InputIterator __last,
 
  233          const allocator_type& __a)
 
  234     : _M_t(_Compare(), _Pair_alloc_type(__a))
 
  235         { _M_t._M_insert_equal(__first, __last); }
 
  247       template<
typename _InputIterator>
 
  248         multimap(_InputIterator __first, _InputIterator __last)
 
  250         { _M_t._M_insert_equal(__first, __last); }
 
  263       template<
typename _InputIterator>
 
  264         multimap(_InputIterator __first, _InputIterator __last,
 
  265          const _Compare& __comp,
 
  266          const allocator_type& __a = allocator_type())
 
  267     : _M_t(__comp, _Pair_alloc_type(__a))
 
  268         { _M_t._M_insert_equal(__first, __last); }
 
  293 #if __cplusplus >= 201103L 
  304     if (!_M_t._M_move_assign(__x._M_t))
 
  309         insert(std::__make_move_if_noexcept_iterator(__x.begin()),
 
  310            std::__make_move_if_noexcept_iterator(__x.end()));
 
  331     this->
insert(__l.begin(), __l.end());
 
  339       { 
return allocator_type(_M_t.get_allocator()); }
 
  349       { 
return _M_t.begin(); }
 
  358       { 
return _M_t.begin(); }
 
  367       { 
return _M_t.end(); }
 
  375       end() const _GLIBCXX_NOEXCEPT
 
  376       { 
return _M_t.end(); }
 
  385       { 
return _M_t.rbegin(); }
 
  392       const_reverse_iterator
 
  394       { 
return _M_t.rbegin(); }
 
  403       { 
return _M_t.rend(); }
 
  410       const_reverse_iterator
 
  412       { 
return _M_t.rend(); }
 
  414 #if __cplusplus >= 201103L 
  422       { 
return _M_t.begin(); }
 
  431       { 
return _M_t.end(); }
 
  438       const_reverse_iterator
 
  440       { 
return _M_t.rbegin(); }
 
  447       const_reverse_iterator
 
  449       { 
return _M_t.rend(); }
 
  456       { 
return _M_t.empty(); }
 
  461       { 
return _M_t.size(); }
 
  466       { 
return _M_t.max_size(); }
 
  469 #if __cplusplus >= 201103L 
  486       template<
typename... _Args>
 
  489     { 
return _M_t._M_emplace_equal(std::forward<_Args>(__args)...); }
 
  513       template<
typename... _Args>
 
  517       return _M_t._M_emplace_hint_equal(__pos,
 
  518                         std::forward<_Args>(__args)...);
 
  536       { 
return _M_t._M_insert_equal(__x); }
 
  538 #if __cplusplus >= 201103L 
  539       template<
typename _Pair, 
typename = 
typename 
  540            std::enable_if<std::is_constructible<value_type,
 
  541                             _Pair&&>::value>::type>
 
  544         { 
return _M_t._M_insert_equal(std::forward<_Pair>(__x)); }
 
  568 #if __cplusplus >= 201103L 
  569       insert(const_iterator __position, 
const value_type& __x)
 
  571       insert(iterator __position, 
const value_type& __x)
 
  573       { 
return _M_t._M_insert_equal_(__position, __x); }
 
  575 #if __cplusplus >= 201103L 
  576       template<
typename _Pair, 
typename = 
typename 
  577            std::enable_if<std::is_constructible<value_type,
 
  578                             _Pair&&>::value>::type>
 
  580         insert(const_iterator __position, _Pair&& __x)
 
  581         { 
return _M_t._M_insert_equal_(__position,
 
  582                        std::forward<_Pair>(__x)); }
 
  594       template<
typename _InputIterator>
 
  596         insert(_InputIterator __first, _InputIterator __last)
 
  597         { _M_t._M_insert_equal(__first, __last); }
 
  599 #if __cplusplus >= 201103L 
  609       { this->
insert(__l.begin(), __l.end()); }
 
  612 #if __cplusplus >= 201103L 
  630       { 
return _M_t.erase(__position); }
 
  633       _GLIBCXX_ABI_TAG_CXX11
 
  636       { 
return _M_t.erase(__position); }
 
  649       erase(iterator __position)
 
  650       { _M_t.erase(__position); }
 
  666       { 
return _M_t.erase(__x); }
 
  668 #if __cplusplus >= 201103L 
  686       erase(const_iterator __first, const_iterator __last)
 
  687       { 
return _M_t.erase(__first, __last); }
 
  706       { _M_t.erase(__first, __last); }
 
  722 #if __cplusplus >= 201103L 
  723       noexcept(_Alloc_traits::_S_nothrow_swap())
 
  725       { _M_t.swap(__x._M_t); }
 
  744       { 
return _M_t.key_comp(); }
 
  752       { 
return value_compare(_M_t.key_comp()); }
 
  768       { 
return _M_t.find(__x); }
 
  782       find(
const key_type& __x)
 const 
  783       { 
return _M_t.find(__x); }
 
  792       { 
return _M_t.count(__x); }
 
  807       { 
return _M_t.lower_bound(__x); }
 
  822       { 
return _M_t.lower_bound(__x); }
 
  832       { 
return _M_t.upper_bound(__x); }
 
  842       { 
return _M_t.upper_bound(__x); }
 
  859       { 
return _M_t.equal_range(__x); }
 
  876       { 
return _M_t.equal_range(__x); }
 
  878       template<
typename _K1, 
typename _T1, 
typename _C1, 
typename _A1>
 
  883       template<
typename _K1, 
typename _T1, 
typename _C1, 
typename _A1>
 
  885         operator<(const multimap<_K1, _T1, _C1, _A1>&,
 
  899   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  903     { 
return __x._M_t == __y._M_t; }
 
  916   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  918     operator<(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
 
  920     { 
return __x._M_t < __y._M_t; }
 
  923   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  927     { 
return !(__x == __y); }
 
  930   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  934     { 
return __y < __x; }
 
  937   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  939     operator<=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
 
  941     { 
return !(__y < __x); }
 
  944   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  948     { 
return !(__x < __y); }
 
  951   template<
typename _Key, 
typename _Tp, 
typename _Compare, 
typename _Alloc>
 
  957 _GLIBCXX_END_NAMESPACE_CONTAINER
 
std::pair< iterator, iterator > equal_range(const key_type &__x)
Finds a subsequence matching given key. 
const_iterator cend() const noexcept
multimap(const multimap &__m, const allocator_type &__a)
Allocator-extended copy constructor. 
noexcept(is_nothrow_copy_constructible< _Compare >::value)
Multimap move constructor. 
iterator erase(const_iterator __first, const_iterator __last)
Erases a [first,last) range of elements from a multimap. 
iterator erase(const_iterator __position)
Erases an element from a multimap. 
multimap & operator=(const multimap &__x)
Multimap assignment operator. 
Uniform interface to C++98 and C++0x allocators. 
size_type size() const noexcept
bool empty() const noexcept
multimap(const allocator_type &__a)
Allocator-extended default constructor. 
value_compare value_comp() const 
_T1 first
second_type is the second bound type 
multimap(_InputIterator __first, _InputIterator __last)
Builds a multimap from a range. 
Struct holding two objects of arbitrary type. 
multimap(const _Compare &__comp, const allocator_type &__a=allocator_type())
Creates a multimap with no elements. 
allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object. 
multimap(initializer_list< value_type > __l, const allocator_type &__a)
Allocator-extended initialier-list constructor. 
A standard container made up of (key,value) pairs, which can be retrieved based on a key...
void insert(initializer_list< value_type > __l)
Attempts to insert a list of std::pairs into the multimap. 
multimap(_InputIterator __first, _InputIterator __last, const _Compare &__comp, const allocator_type &__a=allocator_type())
Builds a multimap from a range. 
iterator begin() noexcept
multimap(const multimap &__x)
Multimap copy constructor. 
multimap()
Default constructor creates no elements. 
iterator emplace_hint(const_iterator __pos, _Args &&...__args)
Builds and inserts a std::pair into the multimap. 
multimap(initializer_list< value_type > __l, const _Compare &__comp=_Compare(), const allocator_type &__a=allocator_type())
Builds a multimap from an initializer_list. 
const_iterator find(const key_type &__x) const 
Tries to locate an element in a multimap. 
size_type max_size() const noexcept
One of the comparison functors. 
const_iterator cbegin() const noexcept
key_compare key_comp() const 
multimap(_InputIterator __first, _InputIterator __last, const allocator_type &__a)
Allocator-extended range constructor. 
iterator emplace(_Args &&...__args)
Build and insert a std::pair into the multimap. 
void insert(_InputIterator __first, _InputIterator __last)
A template function that attempts to insert a range of elements. 
const_iterator end() const noexcept
const_reverse_iterator rbegin() const noexcept
const_reverse_iterator rend() const noexcept
iterator find(const key_type &__x)
Tries to locate an element in a multimap. 
reverse_iterator rend() noexcept
size_type count(const key_type &__x) const 
Finds the number of elements with given key. 
iterator lower_bound(const key_type &__x)
Finds the beginning of a subsequence matching given key. 
iterator insert(const value_type &__x)
Inserts a std::pair into the multimap. 
The standard allocator, as per [20.4]. 
void swap(function< _Res(_Args...)> &__x, function< _Res(_Args...)> &__y)
Swap the targets of two polymorphic function object wrappers. 
reverse_iterator rbegin() noexcept
const_iterator lower_bound(const key_type &__x) const 
Finds the beginning of a subsequence matching given key. 
const_iterator begin() const noexcept
std::pair< const_iterator, const_iterator > equal_range(const key_type &__x) const 
Finds a subsequence matching given key. 
multimap & operator=(initializer_list< value_type > __l)
Multimap list assignment operator. 
size_type erase(const key_type &__x)
Erases elements according to the provided key. 
const_iterator upper_bound(const key_type &__x) const 
Finds the end of a subsequence matching given key. 
const_reverse_iterator crend() const noexcept
const_reverse_iterator crbegin() const noexcept
iterator upper_bound(const key_type &__x)
Finds the end of a subsequence matching given key. 
multimap & operator=(multimap &&__x) noexcept(_Alloc_traits::_S_nothrow_move())
Multimap move assignment operator.