libstdc++
stl_map.h
Go to the documentation of this file.
1 // Map implementation -*- C++ -*-
2 
3 // Copyright (C) 2001-2013 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /*
26  *
27  * Copyright (c) 1994
28  * Hewlett-Packard Company
29  *
30  * Permission to use, copy, modify, distribute and sell this software
31  * and its documentation for any purpose is hereby granted without fee,
32  * provided that the above copyright notice appear in all copies and
33  * that both that copyright notice and this permission notice appear
34  * in supporting documentation. Hewlett-Packard Company makes no
35  * representations about the suitability of this software for any
36  * purpose. It is provided "as is" without express or implied warranty.
37  *
38  *
39  * Copyright (c) 1996,1997
40  * Silicon Graphics Computer Systems, Inc.
41  *
42  * Permission to use, copy, modify, distribute and sell this software
43  * and its documentation for any purpose is hereby granted without fee,
44  * provided that the above copyright notice appear in all copies and
45  * that both that copyright notice and this permission notice appear
46  * in supporting documentation. Silicon Graphics makes no
47  * representations about the suitability of this software for any
48  * purpose. It is provided "as is" without express or implied warranty.
49  */
50 
51 /** @file bits/stl_map.h
52  * This is an internal header file, included by other library headers.
53  * Do not attempt to use it directly. @headername{map}
54  */
55 
56 #ifndef _STL_MAP_H
57 #define _STL_MAP_H 1
58 
59 #include <bits/functexcept.h>
60 #include <bits/concept_check.h>
61 #if __cplusplus >= 201103L
62 #include <initializer_list>
63 #include <tuple>
64 #endif
65 
66 namespace std _GLIBCXX_VISIBILITY(default)
67 {
68 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
69 
70  /**
71  * @brief A standard container made up of (key,value) pairs, which can be
72  * retrieved based on a key, in logarithmic time.
73  *
74  * @ingroup associative_containers
75  *
76  * @tparam _Key Type of key objects.
77  * @tparam _Tp Type of mapped objects.
78  * @tparam _Compare Comparison function object type, defaults to less<_Key>.
79  * @tparam _Alloc Allocator type, defaults to
80  * allocator<pair<const _Key, _Tp>.
81  *
82  * Meets the requirements of a <a href="tables.html#65">container</a>, a
83  * <a href="tables.html#66">reversible container</a>, and an
84  * <a href="tables.html#69">associative container</a> (using unique keys).
85  * For a @c map<Key,T> the key_type is Key, the mapped_type is T, and the
86  * value_type is std::pair<const Key,T>.
87  *
88  * Maps support bidirectional iterators.
89  *
90  * The private tree data is declared exactly the same way for map and
91  * multimap; the distinction is made entirely in how the tree functions are
92  * called (*_unique versus *_equal, same as the standard).
93  */
94  template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
95  typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
96  class map
97  {
98  public:
99  typedef _Key key_type;
100  typedef _Tp mapped_type;
102  typedef _Compare key_compare;
103  typedef _Alloc allocator_type;
104 
105  private:
106  // concept requirements
107  typedef typename _Alloc::value_type _Alloc_value_type;
108  __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
109  __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
110  _BinaryFunctionConcept)
111  __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
112 
113  public:
114  class value_compare
115  : public std::binary_function<value_type, value_type, bool>
116  {
117  friend class map<_Key, _Tp, _Compare, _Alloc>;
118  protected:
119  _Compare comp;
120 
121  value_compare(_Compare __c)
122  : comp(__c) { }
123 
124  public:
125  bool operator()(const value_type& __x, const value_type& __y) const
126  { return comp(__x.first, __y.first); }
127  };
128 
129  private:
130  /// This turns a red-black tree into a [multi]map.
131  typedef typename _Alloc::template rebind<value_type>::other
132  _Pair_alloc_type;
133 
134  typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
135  key_compare, _Pair_alloc_type> _Rep_type;
136 
137  /// The actual tree structure.
138  _Rep_type _M_t;
139 
140  public:
141  // many of these are specified differently in ISO, but the following are
142  // "functionally equivalent"
143  typedef typename _Pair_alloc_type::pointer pointer;
144  typedef typename _Pair_alloc_type::const_pointer const_pointer;
145  typedef typename _Pair_alloc_type::reference reference;
146  typedef typename _Pair_alloc_type::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;
153 
154  // [23.3.1.1] construct/copy/destroy
155  // (get_allocator() is normally listed in this section, but seems to have
156  // been accidentally omitted in the printed standard)
157  /**
158  * @brief Default constructor creates no elements.
159  */
160  map()
161  : _M_t() { }
162 
163  /**
164  * @brief Creates a %map with no elements.
165  * @param __comp A comparison object.
166  * @param __a An allocator object.
167  */
168  explicit
169  map(const _Compare& __comp,
170  const allocator_type& __a = allocator_type())
171  : _M_t(__comp, _Pair_alloc_type(__a)) { }
172 
173  /**
174  * @brief %Map copy constructor.
175  * @param __x A %map of identical element and allocator types.
176  *
177  * The newly-created %map uses a copy of the allocation object
178  * used by @a __x.
179  */
180  map(const map& __x)
181  : _M_t(__x._M_t) { }
182 
183 #if __cplusplus >= 201103L
184  /**
185  * @brief %Map move constructor.
186  * @param __x A %map of identical element and allocator types.
187  *
188  * The newly-created %map contains the exact contents of @a __x.
189  * The contents of @a __x are a valid, but unspecified %map.
190  */
191  map(map&& __x)
192  noexcept(is_nothrow_copy_constructible<_Compare>::value)
193  : _M_t(std::move(__x._M_t)) { }
194 
195  /**
196  * @brief Builds a %map from an initializer_list.
197  * @param __l An initializer_list.
198  * @param __comp A comparison object.
199  * @param __a An allocator object.
200  *
201  * Create a %map consisting of copies of the elements in the
202  * initializer_list @a __l.
203  * This is linear in N if the range is already sorted, and NlogN
204  * otherwise (where N is @a __l.size()).
205  */
206  map(initializer_list<value_type> __l,
207  const _Compare& __comp = _Compare(),
208  const allocator_type& __a = allocator_type())
209  : _M_t(__comp, _Pair_alloc_type(__a))
210  { _M_t._M_insert_unique(__l.begin(), __l.end()); }
211 #endif
212 
213  /**
214  * @brief Builds a %map from a range.
215  * @param __first An input iterator.
216  * @param __last An input iterator.
217  *
218  * Create a %map consisting of copies of the elements from
219  * [__first,__last). This is linear in N if the range is
220  * already sorted, and NlogN otherwise (where N is
221  * distance(__first,__last)).
222  */
223  template<typename _InputIterator>
224  map(_InputIterator __first, _InputIterator __last)
225  : _M_t()
226  { _M_t._M_insert_unique(__first, __last); }
227 
228  /**
229  * @brief Builds a %map from a range.
230  * @param __first An input iterator.
231  * @param __last An input iterator.
232  * @param __comp A comparison functor.
233  * @param __a An allocator object.
234  *
235  * Create a %map consisting of copies of the elements from
236  * [__first,__last). This is linear in N if the range is
237  * already sorted, and NlogN otherwise (where N is
238  * distance(__first,__last)).
239  */
240  template<typename _InputIterator>
241  map(_InputIterator __first, _InputIterator __last,
242  const _Compare& __comp,
243  const allocator_type& __a = allocator_type())
244  : _M_t(__comp, _Pair_alloc_type(__a))
245  { _M_t._M_insert_unique(__first, __last); }
246 
247  // FIXME There is no dtor declared, but we should have something
248  // generated by Doxygen. I don't know what tags to add to this
249  // paragraph to make that happen:
250  /**
251  * The dtor only erases the elements, and note that if the elements
252  * themselves are pointers, the pointed-to memory is not touched in any
253  * way. Managing the pointer is the user's responsibility.
254  */
255 
256  /**
257  * @brief %Map assignment operator.
258  * @param __x A %map of identical element and allocator types.
259  *
260  * All the elements of @a __x are copied, but unlike the copy
261  * constructor, the allocator object is not copied.
262  */
263  map&
264  operator=(const map& __x)
265  {
266  _M_t = __x._M_t;
267  return *this;
268  }
269 
270 #if __cplusplus >= 201103L
271  /**
272  * @brief %Map move assignment operator.
273  * @param __x A %map of identical element and allocator types.
274  *
275  * The contents of @a __x are moved into this map (without copying).
276  * @a __x is a valid, but unspecified %map.
277  */
278  map&
279  operator=(map&& __x)
280  {
281  // NB: DR 1204.
282  // NB: DR 675.
283  this->clear();
284  this->swap(__x);
285  return *this;
286  }
287 
288  /**
289  * @brief %Map list assignment operator.
290  * @param __l An initializer_list.
291  *
292  * This function fills a %map with copies of the elements in the
293  * initializer list @a __l.
294  *
295  * Note that the assignment completely changes the %map and
296  * that the resulting %map's size is the same as the number
297  * of elements assigned. Old data may be lost.
298  */
299  map&
300  operator=(initializer_list<value_type> __l)
301  {
302  this->clear();
303  this->insert(__l.begin(), __l.end());
304  return *this;
305  }
306 #endif
307 
308  /// Get a copy of the memory allocation object.
309  allocator_type
310  get_allocator() const _GLIBCXX_NOEXCEPT
311  { return allocator_type(_M_t.get_allocator()); }
312 
313  // iterators
314  /**
315  * Returns a read/write iterator that points to the first pair in the
316  * %map.
317  * Iteration is done in ascending order according to the keys.
318  */
319  iterator
320  begin() _GLIBCXX_NOEXCEPT
321  { return _M_t.begin(); }
322 
323  /**
324  * Returns a read-only (constant) iterator that points to the first pair
325  * in the %map. Iteration is done in ascending order according to the
326  * keys.
327  */
328  const_iterator
329  begin() const _GLIBCXX_NOEXCEPT
330  { return _M_t.begin(); }
331 
332  /**
333  * Returns a read/write iterator that points one past the last
334  * pair in the %map. Iteration is done in ascending order
335  * according to the keys.
336  */
337  iterator
338  end() _GLIBCXX_NOEXCEPT
339  { return _M_t.end(); }
340 
341  /**
342  * Returns a read-only (constant) iterator that points one past the last
343  * pair in the %map. Iteration is done in ascending order according to
344  * the keys.
345  */
346  const_iterator
347  end() const _GLIBCXX_NOEXCEPT
348  { return _M_t.end(); }
349 
350  /**
351  * Returns a read/write reverse iterator that points to the last pair in
352  * the %map. Iteration is done in descending order according to the
353  * keys.
354  */
355  reverse_iterator
356  rbegin() _GLIBCXX_NOEXCEPT
357  { return _M_t.rbegin(); }
358 
359  /**
360  * Returns a read-only (constant) reverse iterator that points to the
361  * last pair in the %map. Iteration is done in descending order
362  * according to the keys.
363  */
364  const_reverse_iterator
365  rbegin() const _GLIBCXX_NOEXCEPT
366  { return _M_t.rbegin(); }
367 
368  /**
369  * Returns a read/write reverse iterator that points to one before the
370  * first pair in the %map. Iteration is done in descending order
371  * according to the keys.
372  */
373  reverse_iterator
374  rend() _GLIBCXX_NOEXCEPT
375  { return _M_t.rend(); }
376 
377  /**
378  * Returns a read-only (constant) reverse iterator that points to one
379  * before the first pair in the %map. Iteration is done in descending
380  * order according to the keys.
381  */
382  const_reverse_iterator
383  rend() const _GLIBCXX_NOEXCEPT
384  { return _M_t.rend(); }
385 
386 #if __cplusplus >= 201103L
387  /**
388  * Returns a read-only (constant) iterator that points to the first pair
389  * in the %map. Iteration is done in ascending order according to the
390  * keys.
391  */
392  const_iterator
393  cbegin() const noexcept
394  { return _M_t.begin(); }
395 
396  /**
397  * Returns a read-only (constant) iterator that points one past the last
398  * pair in the %map. Iteration is done in ascending order according to
399  * the keys.
400  */
401  const_iterator
402  cend() const noexcept
403  { return _M_t.end(); }
404 
405  /**
406  * Returns a read-only (constant) reverse iterator that points to the
407  * last pair in the %map. Iteration is done in descending order
408  * according to the keys.
409  */
410  const_reverse_iterator
411  crbegin() const noexcept
412  { return _M_t.rbegin(); }
413 
414  /**
415  * Returns a read-only (constant) reverse iterator that points to one
416  * before the first pair in the %map. Iteration is done in descending
417  * order according to the keys.
418  */
419  const_reverse_iterator
420  crend() const noexcept
421  { return _M_t.rend(); }
422 #endif
423 
424  // capacity
425  /** Returns true if the %map is empty. (Thus begin() would equal
426  * end().)
427  */
428  bool
429  empty() const _GLIBCXX_NOEXCEPT
430  { return _M_t.empty(); }
431 
432  /** Returns the size of the %map. */
433  size_type
434  size() const _GLIBCXX_NOEXCEPT
435  { return _M_t.size(); }
436 
437  /** Returns the maximum size of the %map. */
438  size_type
439  max_size() const _GLIBCXX_NOEXCEPT
440  { return _M_t.max_size(); }
441 
442  // [23.3.1.2] element access
443  /**
444  * @brief Subscript ( @c [] ) access to %map data.
445  * @param __k The key for which data should be retrieved.
446  * @return A reference to the data of the (key,data) %pair.
447  *
448  * Allows for easy lookup with the subscript ( @c [] )
449  * operator. Returns data associated with the key specified in
450  * subscript. If the key does not exist, a pair with that key
451  * is created using default values, which is then returned.
452  *
453  * Lookup requires logarithmic time.
454  */
455  mapped_type&
456  operator[](const key_type& __k)
457  {
458  // concept requirements
459  __glibcxx_function_requires(_DefaultConstructibleConcept<mapped_type>)
460 
461  iterator __i = lower_bound(__k);
462  // __i->first is greater than or equivalent to __k.
463  if (__i == end() || key_comp()(__k, (*__i).first))
464 #if __cplusplus >= 201103L
465  __i = _M_t._M_emplace_hint_unique(__i, std::piecewise_construct,
466  std::tuple<const key_type&>(__k),
467  std::tuple<>());
468 #else
469  __i = insert(__i, value_type(__k, mapped_type()));
470 #endif
471  return (*__i).second;
472  }
473 
474 #if __cplusplus >= 201103L
475  mapped_type&
476  operator[](key_type&& __k)
477  {
478  // concept requirements
479  __glibcxx_function_requires(_DefaultConstructibleConcept<mapped_type>)
480 
481  iterator __i = lower_bound(__k);
482  // __i->first is greater than or equivalent to __k.
483  if (__i == end() || key_comp()(__k, (*__i).first))
484  __i = _M_t._M_emplace_hint_unique(__i, std::piecewise_construct,
485  std::forward_as_tuple(std::move(__k)),
486  std::tuple<>());
487  return (*__i).second;
488  }
489 #endif
490 
491  // _GLIBCXX_RESOLVE_LIB_DEFECTS
492  // DR 464. Suggestion for new member functions in standard containers.
493  /**
494  * @brief Access to %map data.
495  * @param __k The key for which data should be retrieved.
496  * @return A reference to the data whose key is equivalent to @a __k, if
497  * such a data is present in the %map.
498  * @throw std::out_of_range If no such data is present.
499  */
500  mapped_type&
501  at(const key_type& __k)
502  {
503  iterator __i = lower_bound(__k);
504  if (__i == end() || key_comp()(__k, (*__i).first))
505  __throw_out_of_range(__N("map::at"));
506  return (*__i).second;
507  }
508 
509  const mapped_type&
510  at(const key_type& __k) const
511  {
512  const_iterator __i = lower_bound(__k);
513  if (__i == end() || key_comp()(__k, (*__i).first))
514  __throw_out_of_range(__N("map::at"));
515  return (*__i).second;
516  }
517 
518  // modifiers
519 #if __cplusplus >= 201103L
520  /**
521  * @brief Attempts to build and insert a std::pair into the %map.
522  *
523  * @param __args Arguments used to generate a new pair instance (see
524  * std::piecewise_contruct for passing arguments to each
525  * part of the pair constructor).
526  *
527  * @return A pair, of which the first element is an iterator that points
528  * to the possibly inserted pair, and the second is a bool that
529  * is true if the pair was actually inserted.
530  *
531  * This function attempts to build and insert a (key, value) %pair into
532  * the %map.
533  * A %map relies on unique keys and thus a %pair is only inserted if its
534  * first element (the key) is not already present in the %map.
535  *
536  * Insertion requires logarithmic time.
537  */
538  template<typename... _Args>
540  emplace(_Args&&... __args)
541  { return _M_t._M_emplace_unique(std::forward<_Args>(__args)...); }
542 
543  /**
544  * @brief Attempts to build and insert a std::pair into the %map.
545  *
546  * @param __pos An iterator that serves as a hint as to where the pair
547  * should be inserted.
548  * @param __args Arguments used to generate a new pair instance (see
549  * std::piecewise_contruct for passing arguments to each
550  * part of the pair constructor).
551  * @return An iterator that points to the element with key of the
552  * std::pair built from @a __args (may or may not be that
553  * std::pair).
554  *
555  * This function is not concerned about whether the insertion took place,
556  * and thus does not return a boolean like the single-argument emplace()
557  * does.
558  * Note that the first parameter is only a hint and can potentially
559  * improve the performance of the insertion process. A bad hint would
560  * cause no gains in efficiency.
561  *
562  * See
563  * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt07ch17.html
564  * for more on @a hinting.
565  *
566  * Insertion requires logarithmic time (if the hint is not taken).
567  */
568  template<typename... _Args>
569  iterator
570  emplace_hint(const_iterator __pos, _Args&&... __args)
571  {
572  return _M_t._M_emplace_hint_unique(__pos,
573  std::forward<_Args>(__args)...);
574  }
575 #endif
576 
577  /**
578  * @brief Attempts to insert a std::pair into the %map.
579 
580  * @param __x Pair to be inserted (see std::make_pair for easy
581  * creation of pairs).
582  *
583  * @return A pair, of which the first element is an iterator that
584  * points to the possibly inserted pair, and the second is
585  * a bool that is true if the pair was actually inserted.
586  *
587  * This function attempts to insert a (key, value) %pair into the %map.
588  * A %map relies on unique keys and thus a %pair is only inserted if its
589  * first element (the key) is not already present in the %map.
590  *
591  * Insertion requires logarithmic time.
592  */
594  insert(const value_type& __x)
595  { return _M_t._M_insert_unique(__x); }
596 
597 #if __cplusplus >= 201103L
598  template<typename _Pair, typename = typename
599  std::enable_if<std::is_constructible<value_type,
600  _Pair&&>::value>::type>
602  insert(_Pair&& __x)
603  { return _M_t._M_insert_unique(std::forward<_Pair>(__x)); }
604 #endif
605 
606 #if __cplusplus >= 201103L
607  /**
608  * @brief Attempts to insert a list of std::pairs into the %map.
609  * @param __list A std::initializer_list<value_type> of pairs to be
610  * inserted.
611  *
612  * Complexity similar to that of the range constructor.
613  */
614  void
615  insert(std::initializer_list<value_type> __list)
616  { insert(__list.begin(), __list.end()); }
617 #endif
618 
619  /**
620  * @brief Attempts to insert a std::pair into the %map.
621  * @param __position An iterator that serves as a hint as to where the
622  * pair should be inserted.
623  * @param __x Pair to be inserted (see std::make_pair for easy creation
624  * of pairs).
625  * @return An iterator that points to the element with key of
626  * @a __x (may or may not be the %pair passed in).
627  *
628 
629  * This function is not concerned about whether the insertion
630  * took place, and thus does not return a boolean like the
631  * single-argument insert() does. Note that the first
632  * parameter is only a hint and can potentially improve the
633  * performance of the insertion process. A bad hint would
634  * cause no gains in efficiency.
635  *
636  * See
637  * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt07ch17.html
638  * for more on @a hinting.
639  *
640  * Insertion requires logarithmic time (if the hint is not taken).
641  */
642  iterator
643 #if __cplusplus >= 201103L
644  insert(const_iterator __position, const value_type& __x)
645 #else
646  insert(iterator __position, const value_type& __x)
647 #endif
648  { return _M_t._M_insert_unique_(__position, __x); }
649 
650 #if __cplusplus >= 201103L
651  template<typename _Pair, typename = typename
652  std::enable_if<std::is_constructible<value_type,
653  _Pair&&>::value>::type>
654  iterator
655  insert(const_iterator __position, _Pair&& __x)
656  { return _M_t._M_insert_unique_(__position,
657  std::forward<_Pair>(__x)); }
658 #endif
659 
660  /**
661  * @brief Template function that attempts to insert a range of elements.
662  * @param __first Iterator pointing to the start of the range to be
663  * inserted.
664  * @param __last Iterator pointing to the end of the range.
665  *
666  * Complexity similar to that of the range constructor.
667  */
668  template<typename _InputIterator>
669  void
670  insert(_InputIterator __first, _InputIterator __last)
671  { _M_t._M_insert_unique(__first, __last); }
672 
673 #if __cplusplus >= 201103L
674  // _GLIBCXX_RESOLVE_LIB_DEFECTS
675  // DR 130. Associative erase should return an iterator.
676  /**
677  * @brief Erases an element from a %map.
678  * @param __position An iterator pointing to the element to be erased.
679  * @return An iterator pointing to the element immediately following
680  * @a position prior to the element being erased. If no such
681  * element exists, end() is returned.
682  *
683  * This function erases an element, pointed to by the given
684  * iterator, from a %map. Note that this function only erases
685  * the element, and that if the element is itself a pointer,
686  * the pointed-to memory is not touched in any way. Managing
687  * the pointer is the user's responsibility.
688  */
689  iterator
690  erase(const_iterator __position)
691  { return _M_t.erase(__position); }
692 
693  // LWG 2059
694  _GLIBCXX_ABI_TAG_CXX11
695  iterator
696  erase(iterator __position)
697  { return _M_t.erase(__position); }
698 #else
699  /**
700  * @brief Erases an element from a %map.
701  * @param __position An iterator pointing to the element to be erased.
702  *
703  * This function erases an element, pointed to by the given
704  * iterator, from a %map. Note that this function only erases
705  * the element, and that if the element is itself a pointer,
706  * the pointed-to memory is not touched in any way. Managing
707  * the pointer is the user's responsibility.
708  */
709  void
710  erase(iterator __position)
711  { _M_t.erase(__position); }
712 #endif
713 
714  /**
715  * @brief Erases elements according to the provided key.
716  * @param __x Key of element to be erased.
717  * @return The number of elements erased.
718  *
719  * This function erases all the elements located by the given key from
720  * a %map.
721  * Note that this function only erases the element, and that if
722  * the element is itself a pointer, the pointed-to memory is not touched
723  * in any way. Managing the pointer is the user's responsibility.
724  */
725  size_type
726  erase(const key_type& __x)
727  { return _M_t.erase(__x); }
728 
729 #if __cplusplus >= 201103L
730  // _GLIBCXX_RESOLVE_LIB_DEFECTS
731  // DR 130. Associative erase should return an iterator.
732  /**
733  * @brief Erases a [first,last) range of elements from a %map.
734  * @param __first Iterator pointing to the start of the range to be
735  * erased.
736  * @param __last Iterator pointing to the end of the range to
737  * be erased.
738  * @return The iterator @a __last.
739  *
740  * This function erases a sequence of elements from a %map.
741  * Note that this function only erases the element, and that if
742  * the element is itself a pointer, the pointed-to memory is not touched
743  * in any way. Managing the pointer is the user's responsibility.
744  */
745  iterator
746  erase(const_iterator __first, const_iterator __last)
747  { return _M_t.erase(__first, __last); }
748 #else
749  /**
750  * @brief Erases a [__first,__last) range of elements from a %map.
751  * @param __first Iterator pointing to the start of the range to be
752  * erased.
753  * @param __last Iterator pointing to the end of the range to
754  * be erased.
755  *
756  * This function erases a sequence of elements from a %map.
757  * Note that this function only erases the element, and that if
758  * the element is itself a pointer, the pointed-to memory is not touched
759  * in any way. Managing the pointer is the user's responsibility.
760  */
761  void
762  erase(iterator __first, iterator __last)
763  { _M_t.erase(__first, __last); }
764 #endif
765 
766  /**
767  * @brief Swaps data with another %map.
768  * @param __x A %map of the same element and allocator types.
769  *
770  * This exchanges the elements between two maps in constant
771  * time. (It is only swapping a pointer, an integer, and an
772  * instance of the @c Compare type (which itself is often
773  * stateless and empty), so it should be quite fast.) Note
774  * that the global std::swap() function is specialized such
775  * that std::swap(m1,m2) will feed to this function.
776  */
777  void
778  swap(map& __x)
779  { _M_t.swap(__x._M_t); }
780 
781  /**
782  * Erases all elements in a %map. Note that this function only
783  * erases the elements, and that if the elements themselves are
784  * pointers, the pointed-to memory is not touched in any way.
785  * Managing the pointer is the user's responsibility.
786  */
787  void
788  clear() _GLIBCXX_NOEXCEPT
789  { _M_t.clear(); }
790 
791  // observers
792  /**
793  * Returns the key comparison object out of which the %map was
794  * constructed.
795  */
796  key_compare
797  key_comp() const
798  { return _M_t.key_comp(); }
799 
800  /**
801  * Returns a value comparison object, built from the key comparison
802  * object out of which the %map was constructed.
803  */
804  value_compare
805  value_comp() const
806  { return value_compare(_M_t.key_comp()); }
807 
808  // [23.3.1.3] map operations
809  /**
810  * @brief Tries to locate an element in a %map.
811  * @param __x Key of (key, value) %pair to be located.
812  * @return Iterator pointing to sought-after element, or end() if not
813  * found.
814  *
815  * This function takes a key and tries to locate the element with which
816  * the key matches. If successful the function returns an iterator
817  * pointing to the sought after %pair. If unsuccessful it returns the
818  * past-the-end ( @c end() ) iterator.
819  */
820  iterator
821  find(const key_type& __x)
822  { return _M_t.find(__x); }
823 
824  /**
825  * @brief Tries to locate an element in a %map.
826  * @param __x Key of (key, value) %pair to be located.
827  * @return Read-only (constant) iterator pointing to sought-after
828  * element, or end() if not found.
829  *
830  * This function takes a key and tries to locate the element with which
831  * the key matches. If successful the function returns a constant
832  * iterator pointing to the sought after %pair. If unsuccessful it
833  * returns the past-the-end ( @c end() ) iterator.
834  */
835  const_iterator
836  find(const key_type& __x) const
837  { return _M_t.find(__x); }
838 
839  /**
840  * @brief Finds the number of elements with given key.
841  * @param __x Key of (key, value) pairs to be located.
842  * @return Number of elements with specified key.
843  *
844  * This function only makes sense for multimaps; for map the result will
845  * either be 0 (not present) or 1 (present).
846  */
847  size_type
848  count(const key_type& __x) const
849  { return _M_t.find(__x) == _M_t.end() ? 0 : 1; }
850 
851  /**
852  * @brief Finds the beginning of a subsequence matching given key.
853  * @param __x Key of (key, value) pair to be located.
854  * @return Iterator pointing to first element equal to or greater
855  * than key, or end().
856  *
857  * This function returns the first element of a subsequence of elements
858  * that matches the given key. If unsuccessful it returns an iterator
859  * pointing to the first element that has a greater value than given key
860  * or end() if no such element exists.
861  */
862  iterator
863  lower_bound(const key_type& __x)
864  { return _M_t.lower_bound(__x); }
865 
866  /**
867  * @brief Finds the beginning of a subsequence matching given key.
868  * @param __x Key of (key, value) pair to be located.
869  * @return Read-only (constant) iterator pointing to first element
870  * equal to or greater than key, or end().
871  *
872  * This function returns the first element of a subsequence of elements
873  * that matches the given key. If unsuccessful it returns an iterator
874  * pointing to the first element that has a greater value than given key
875  * or end() if no such element exists.
876  */
877  const_iterator
878  lower_bound(const key_type& __x) const
879  { return _M_t.lower_bound(__x); }
880 
881  /**
882  * @brief Finds the end of a subsequence matching given key.
883  * @param __x Key of (key, value) pair to be located.
884  * @return Iterator pointing to the first element
885  * greater than key, or end().
886  */
887  iterator
888  upper_bound(const key_type& __x)
889  { return _M_t.upper_bound(__x); }
890 
891  /**
892  * @brief Finds the end of a subsequence matching given key.
893  * @param __x Key of (key, value) pair to be located.
894  * @return Read-only (constant) iterator pointing to first iterator
895  * greater than key, or end().
896  */
897  const_iterator
898  upper_bound(const key_type& __x) const
899  { return _M_t.upper_bound(__x); }
900 
901  /**
902  * @brief Finds a subsequence matching given key.
903  * @param __x Key of (key, value) pairs to be located.
904  * @return Pair of iterators that possibly points to the subsequence
905  * matching given key.
906  *
907  * This function is equivalent to
908  * @code
909  * std::make_pair(c.lower_bound(val),
910  * c.upper_bound(val))
911  * @endcode
912  * (but is faster than making the calls separately).
913  *
914  * This function probably only makes sense for multimaps.
915  */
917  equal_range(const key_type& __x)
918  { return _M_t.equal_range(__x); }
919 
920  /**
921  * @brief Finds a subsequence matching given key.
922  * @param __x Key of (key, value) pairs to be located.
923  * @return Pair of read-only (constant) iterators that possibly points
924  * to the subsequence matching given key.
925  *
926  * This function is equivalent to
927  * @code
928  * std::make_pair(c.lower_bound(val),
929  * c.upper_bound(val))
930  * @endcode
931  * (but is faster than making the calls separately).
932  *
933  * This function probably only makes sense for multimaps.
934  */
936  equal_range(const key_type& __x) const
937  { return _M_t.equal_range(__x); }
938 
939  template<typename _K1, typename _T1, typename _C1, typename _A1>
940  friend bool
942  const map<_K1, _T1, _C1, _A1>&);
943 
944  template<typename _K1, typename _T1, typename _C1, typename _A1>
945  friend bool
946  operator<(const map<_K1, _T1, _C1, _A1>&,
947  const map<_K1, _T1, _C1, _A1>&);
948  };
949 
950  /**
951  * @brief Map equality comparison.
952  * @param __x A %map.
953  * @param __y A %map of the same type as @a x.
954  * @return True iff the size and elements of the maps are equal.
955  *
956  * This is an equivalence relation. It is linear in the size of the
957  * maps. Maps are considered equivalent if their sizes are equal,
958  * and if corresponding elements compare equal.
959  */
960  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
961  inline bool
964  { return __x._M_t == __y._M_t; }
965 
966  /**
967  * @brief Map ordering relation.
968  * @param __x A %map.
969  * @param __y A %map of the same type as @a x.
970  * @return True iff @a x is lexicographically less than @a y.
971  *
972  * This is a total ordering relation. It is linear in the size of the
973  * maps. The elements must be comparable with @c <.
974  *
975  * See std::lexicographical_compare() for how the determination is made.
976  */
977  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
978  inline bool
979  operator<(const map<_Key, _Tp, _Compare, _Alloc>& __x,
981  { return __x._M_t < __y._M_t; }
982 
983  /// Based on operator==
984  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
985  inline bool
988  { return !(__x == __y); }
989 
990  /// Based on operator<
991  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
992  inline bool
995  { return __y < __x; }
996 
997  /// Based on operator<
998  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
999  inline bool
1000  operator<=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
1002  { return !(__y < __x); }
1003 
1004  /// Based on operator<
1005  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
1006  inline bool
1009  { return !(__x < __y); }
1010 
1011  /// See std::map::swap().
1012  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
1013  inline void
1016  { __x.swap(__y); }
1017 
1018 _GLIBCXX_END_NAMESPACE_CONTAINER
1019 } // namespace std
1020 
1021 #endif /* _STL_MAP_H */
std::pair< iterator, bool > emplace(_Args &&...__args)
Attempts to build and insert a std::pair into the map.
Definition: stl_map.h:540
mapped_type & at(const key_type &__k)
Access to map data.
Definition: stl_map.h:501
const_iterator find(const key_type &__x) const
Tries to locate an element in a map.
Definition: stl_map.h:836
void insert(std::initializer_list< value_type > __list)
Attempts to insert a list of std::pairs into the map.
Definition: stl_map.h:615
reverse_iterator rbegin() noexcept
Definition: stl_map.h:356
reverse_iterator rend() noexcept
Definition: stl_map.h:374
constexpr piecewise_construct_t piecewise_construct
piecewise_construct
Definition: stl_pair.h:79
map(const map &__x)
Map copy constructor.
Definition: stl_map.h:180
allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object.
Definition: stl_map.h:310
map(_InputIterator __first, _InputIterator __last)
Builds a map from a range.
Definition: stl_map.h:224
map & operator=(initializer_list< value_type > __l)
Map list assignment operator.
Definition: stl_map.h:300
const_reverse_iterator crbegin() const noexcept
Definition: stl_map.h:411
map(_InputIterator __first, _InputIterator __last, const _Compare &__comp, const allocator_type &__a=allocator_type())
Builds a map from a range.
Definition: stl_map.h:241
map()
Default constructor creates no elements.
Definition: stl_map.h:160
const_iterator cbegin() const noexcept
Definition: stl_map.h:393
map(initializer_list< value_type > __l, const _Compare &__comp=_Compare(), const allocator_type &__a=allocator_type())
Builds a map from an initializer_list.
Definition: stl_map.h:206
const_iterator cend() const noexcept
Definition: stl_map.h:402
void swap(map &__x)
Swaps data with another map.
Definition: stl_map.h:778
map & operator=(map &&__x)
Map move assignment operator.
Definition: stl_map.h:279
const_reverse_iterator crend() const noexcept
Definition: stl_map.h:420
bool operator==(const map< _Key, _Tp, _Compare, _Alloc > &__x, const map< _Key, _Tp, _Compare, _Alloc > &__y)
Map equality comparison.
Definition: stl_map.h:962
void insert(_InputIterator __first, _InputIterator __last)
Template function that attempts to insert a range of elements.
Definition: stl_map.h:670
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Definition: move.h:101
iterator erase(const_iterator __first, const_iterator __last)
Erases a [first,last) range of elements from a map.
Definition: stl_map.h:746
iterator lower_bound(const key_type &__x)
Finds the beginning of a subsequence matching given key.
Definition: stl_map.h:863
bool operator>=(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Test if string doesn't precede string.
iterator insert(const_iterator __position, const value_type &__x)
Attempts to insert a std::pair into the map.
Definition: stl_map.h:644
bool empty() const noexcept
Definition: stl_map.h:429
iterator begin() noexcept
Definition: stl_map.h:320
map(const _Compare &__comp, const allocator_type &__a=allocator_type())
Creates a map with no elements.
Definition: stl_map.h:169
std::pair< iterator, iterator > equal_range(const key_type &__x)
Finds a subsequence matching given key.
Definition: stl_map.h:917
mapped_type & operator[](const key_type &__k)
Subscript ( [] ) access to map data.
Definition: stl_map.h:456
ISO C++ entities toplevel namespace is std.
size_type size() const noexcept
Definition: stl_map.h:434
_T1 first
second_type is the second bound type
Definition: stl_pair.h:101
const_iterator end() const noexcept
Definition: stl_map.h:347
value_compare value_comp() const
Definition: stl_map.h:805
iterator find(const key_type &__x)
Tries to locate an element in a map.
Definition: stl_map.h:821
bool operator!=(const map< _Key, _Tp, _Compare, _Alloc > &__x, const map< _Key, _Tp, _Compare, _Alloc > &__y)
Based on operator==.
Definition: stl_map.h:986
void clear() noexcept
Definition: stl_map.h:788
A standard container made up of (key,value) pairs, which can be retrieved based on a key...
Definition: stl_map.h:96
map(map &&__x) noexcept(is_nothrow_copy_constructible< _Compare >::value)
Map move constructor.
Definition: stl_map.h:191
const_iterator upper_bound(const key_type &__x) const
Finds the end of a subsequence matching given key.
Definition: stl_map.h:898
const_reverse_iterator rbegin() const noexcept
Definition: stl_map.h:365
size_type max_size() const noexcept
Definition: stl_map.h:439
const_iterator lower_bound(const key_type &__x) const
Finds the beginning of a subsequence matching given key.
Definition: stl_map.h:878
const_reverse_iterator rend() const noexcept
Definition: stl_map.h:383
const_iterator begin() const noexcept
Definition: stl_map.h:329
iterator upper_bound(const key_type &__x)
Finds the end of a subsequence matching given key.
Definition: stl_map.h:888
std::pair< const_iterator, const_iterator > equal_range(const key_type &__x) const
Finds a subsequence matching given key.
Definition: stl_map.h:936
size_type count(const key_type &__x) const
Finds the number of elements with given key.
Definition: stl_map.h:848
std::pair< iterator, bool > insert(const value_type &__x)
Attempts to insert a std::pair into the map.
Definition: stl_map.h:594
size_type erase(const key_type &__x)
Erases elements according to the provided key.
Definition: stl_map.h:726
Struct holding two objects of arbitrary type.
Definition: stl_pair.h:96
key_compare key_comp() const
Definition: stl_map.h:797
iterator erase(const_iterator __position)
Erases an element from a map.
Definition: stl_map.h:690
iterator end() noexcept
Definition: stl_map.h:338
map & operator=(const map &__x)
Map assignment operator.
Definition: stl_map.h:264
bool operator>(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Test if string follows string.
iterator emplace_hint(const_iterator __pos, _Args &&...__args)
Attempts to build and insert a std::pair into the map.
Definition: stl_map.h:570