1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #include "qmap.h"
41 
42 #include <stdlib.h>
43 
44 #ifdef QT_QMAP_DEBUG
45 # include <qstring.h>
46 # include <qvector.h>
47 #endif
48 
49 QT_BEGIN_NAMESPACE
50 
51 const QMapDataBase QMapDataBase::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, { 0, nullptr, nullptr }, nullptr };
52 
nextNode() const53 const QMapNodeBase *QMapNodeBase::nextNode() const
54 {
55     const QMapNodeBase *n = this;
56     if (n->right) {
57         n = n->right;
58         while (n->left)
59             n = n->left;
60     } else {
61         const QMapNodeBase *y = n->parent();
62         while (y && n == y->right) {
63             n = y;
64             y = n->parent();
65         }
66         n = y;
67     }
68     return n;
69 }
70 
previousNode() const71 const QMapNodeBase *QMapNodeBase::previousNode() const
72 {
73     const QMapNodeBase *n = this;
74     if (n->left) {
75         n = n->left;
76         while (n->right)
77             n = n->right;
78     } else {
79         const QMapNodeBase *y = n->parent();
80         while (y && n == y->left) {
81             n = y;
82             y = n->parent();
83         }
84         n = y;
85     }
86     return n;
87 }
88 
89 
rotateLeft(QMapNodeBase * x)90 void QMapDataBase::rotateLeft(QMapNodeBase *x)
91 {
92     QMapNodeBase *&root = header.left;
93     QMapNodeBase *y = x->right;
94     x->right = y->left;
95     if (y->left != nullptr)
96         y->left->setParent(x);
97     y->setParent(x->parent());
98     if (x == root)
99         root = y;
100     else if (x == x->parent()->left)
101         x->parent()->left = y;
102     else
103         x->parent()->right = y;
104     y->left = x;
105     x->setParent(y);
106 }
107 
108 
rotateRight(QMapNodeBase * x)109 void QMapDataBase::rotateRight(QMapNodeBase *x)
110 {
111     QMapNodeBase *&root = header.left;
112     QMapNodeBase *y = x->left;
113     x->left = y->right;
114     if (y->right != nullptr)
115         y->right->setParent(x);
116     y->setParent(x->parent());
117     if (x == root)
118         root = y;
119     else if (x == x->parent()->right)
120         x->parent()->right = y;
121     else
122         x->parent()->left = y;
123     y->right = x;
124     x->setParent(y);
125 }
126 
127 
rebalance(QMapNodeBase * x)128 void QMapDataBase::rebalance(QMapNodeBase *x)
129 {
130     QMapNodeBase *&root = header.left;
131     x->setColor(QMapNodeBase::Red);
132     while (x != root && x->parent()->color() == QMapNodeBase::Red) {
133         if (x->parent() == x->parent()->parent()->left) {
134             QMapNodeBase *y = x->parent()->parent()->right;
135             if (y && y->color() == QMapNodeBase::Red) {
136                 x->parent()->setColor(QMapNodeBase::Black);
137                 y->setColor(QMapNodeBase::Black);
138                 x->parent()->parent()->setColor(QMapNodeBase::Red);
139                 x = x->parent()->parent();
140             } else {
141                 if (x == x->parent()->right) {
142                     x = x->parent();
143                     rotateLeft(x);
144                 }
145                 x->parent()->setColor(QMapNodeBase::Black);
146                 x->parent()->parent()->setColor(QMapNodeBase::Red);
147                 rotateRight (x->parent()->parent());
148             }
149         } else {
150             QMapNodeBase *y = x->parent()->parent()->left;
151             if (y && y->color() == QMapNodeBase::Red) {
152                 x->parent()->setColor(QMapNodeBase::Black);
153                 y->setColor(QMapNodeBase::Black);
154                 x->parent()->parent()->setColor(QMapNodeBase::Red);
155                 x = x->parent()->parent();
156             } else {
157                 if (x == x->parent()->left) {
158                     x = x->parent();
159                     rotateRight(x);
160                 }
161                 x->parent()->setColor(QMapNodeBase::Black);
162                 x->parent()->parent()->setColor(QMapNodeBase::Red);
163                 rotateLeft(x->parent()->parent());
164             }
165         }
166     }
167     root->setColor(QMapNodeBase::Black);
168 }
169 
freeNodeAndRebalance(QMapNodeBase * z)170 void QMapDataBase::freeNodeAndRebalance(QMapNodeBase *z)
171 {
172     QMapNodeBase *&root = header.left;
173     QMapNodeBase *y = z;
174     QMapNodeBase *x;
175     QMapNodeBase *x_parent;
176     if (y->left == nullptr) {
177         x = y->right;
178         if (y == mostLeftNode) {
179             if (x)
180                 mostLeftNode = x; // It cannot have (left) children due the red black invariant.
181             else
182                 mostLeftNode = y->parent();
183         }
184     } else {
185         if (y->right == nullptr) {
186             x = y->left;
187         } else {
188             y = y->right;
189             while (y->left != nullptr)
190                 y = y->left;
191             x = y->right;
192         }
193     }
194     if (y != z) {
195         z->left->setParent(y);
196         y->left = z->left;
197         if (y != z->right) {
198             x_parent = y->parent();
199             if (x)
200                 x->setParent(y->parent());
201             y->parent()->left = x;
202             y->right = z->right;
203             z->right->setParent(y);
204         } else {
205             x_parent = y;
206         }
207         if (root == z)
208             root = y;
209         else if (z->parent()->left == z)
210             z->parent()->left = y;
211         else
212             z->parent()->right = y;
213         y->setParent(z->parent());
214         // Swap the colors
215         QMapNodeBase::Color c = y->color();
216         y->setColor(z->color());
217         z->setColor(c);
218         y = z;
219     } else {
220         x_parent = y->parent();
221         if (x)
222             x->setParent(y->parent());
223         if (root == z)
224             root = x;
225         else if (z->parent()->left == z)
226             z->parent()->left = x;
227         else
228             z->parent()->right = x;
229     }
230     if (y->color() != QMapNodeBase::Red) {
231         while (x != root && (x == nullptr || x->color() == QMapNodeBase::Black)) {
232             if (x == x_parent->left) {
233                 QMapNodeBase *w = x_parent->right;
234                 if (w->color() == QMapNodeBase::Red) {
235                     w->setColor(QMapNodeBase::Black);
236                     x_parent->setColor(QMapNodeBase::Red);
237                     rotateLeft(x_parent);
238                     w = x_parent->right;
239                 }
240                 if ((w->left == nullptr || w->left->color() == QMapNodeBase::Black) &&
241                     (w->right == nullptr || w->right->color() == QMapNodeBase::Black)) {
242                     w->setColor(QMapNodeBase::Red);
243                     x = x_parent;
244                     x_parent = x_parent->parent();
245                 } else {
246                     if (w->right == nullptr || w->right->color() == QMapNodeBase::Black) {
247                         if (w->left)
248                             w->left->setColor(QMapNodeBase::Black);
249                         w->setColor(QMapNodeBase::Red);
250                         rotateRight(w);
251                         w = x_parent->right;
252                     }
253                     w->setColor(x_parent->color());
254                     x_parent->setColor(QMapNodeBase::Black);
255                     if (w->right)
256                         w->right->setColor(QMapNodeBase::Black);
257                     rotateLeft(x_parent);
258                     break;
259                 }
260             } else {
261             QMapNodeBase *w = x_parent->left;
262             if (w->color() == QMapNodeBase::Red) {
263                 w->setColor(QMapNodeBase::Black);
264                 x_parent->setColor(QMapNodeBase::Red);
265                 rotateRight(x_parent);
266                 w = x_parent->left;
267             }
268             if ((w->right == nullptr || w->right->color() == QMapNodeBase::Black) &&
269                 (w->left == nullptr|| w->left->color() == QMapNodeBase::Black)) {
270                 w->setColor(QMapNodeBase::Red);
271                 x = x_parent;
272                 x_parent = x_parent->parent();
273             } else {
274                 if (w->left == nullptr || w->left->color() == QMapNodeBase::Black) {
275                     if (w->right)
276                         w->right->setColor(QMapNodeBase::Black);
277                     w->setColor(QMapNodeBase::Red);
278                     rotateLeft(w);
279                     w = x_parent->left;
280                 }
281                 w->setColor(x_parent->color());
282                 x_parent->setColor(QMapNodeBase::Black);
283                 if (w->left)
284                     w->left->setColor(QMapNodeBase::Black);
285                 rotateRight(x_parent);
286                 break;
287             }
288         }
289     }
290     if (x)
291         x->setColor(QMapNodeBase::Black);
292     }
293     free(y);
294     --size;
295 }
296 
recalcMostLeftNode()297 void QMapDataBase::recalcMostLeftNode()
298 {
299     mostLeftNode = &header;
300     while (mostLeftNode->left)
301         mostLeftNode = mostLeftNode->left;
302 }
303 
qMapAlignmentThreshold()304 static inline int qMapAlignmentThreshold()
305 {
306     // malloc on 32-bit platforms should return pointers that are 8-byte
307     // aligned or more while on 64-bit platforms they should be 16-byte aligned
308     // or more
309     return 2 * sizeof(void*);
310 }
311 
qMapAllocate(int alloc,int alignment)312 static inline void *qMapAllocate(int alloc, int alignment)
313 {
314     return alignment > qMapAlignmentThreshold()
315         ? qMallocAligned(alloc, alignment)
316         : ::malloc(alloc);
317 }
318 
qMapDeallocate(QMapNodeBase * node,int alignment)319 static inline void qMapDeallocate(QMapNodeBase *node, int alignment)
320 {
321     if (alignment > qMapAlignmentThreshold())
322         qFreeAligned(node);
323     else
324         ::free(node);
325 }
326 
createNode(int alloc,int alignment,QMapNodeBase * parent,bool left)327 QMapNodeBase *QMapDataBase::createNode(int alloc, int alignment, QMapNodeBase *parent, bool left)
328 {
329     QMapNodeBase *node = static_cast<QMapNodeBase *>(qMapAllocate(alloc, alignment));
330     Q_CHECK_PTR(node);
331 
332     memset(node, 0, alloc);
333     ++size;
334 
335     if (parent) {
336         if (left) {
337             parent->left = node;
338             if (parent == mostLeftNode)
339                 mostLeftNode = node;
340         } else {
341             parent->right = node;
342         }
343         node->setParent(parent);
344         rebalance(node);
345     }
346     return node;
347 }
348 
freeTree(QMapNodeBase * root,int alignment)349 void QMapDataBase::freeTree(QMapNodeBase *root, int alignment)
350 {
351     if (root->left)
352         freeTree(root->left, alignment);
353     if (root->right)
354         freeTree(root->right, alignment);
355     qMapDeallocate(root, alignment);
356 }
357 
createData()358 QMapDataBase *QMapDataBase::createData()
359 {
360     QMapDataBase *d = new QMapDataBase;
361 
362     d->ref.initializeOwned();
363     d->size = 0;
364 
365     d->header.p = 0;
366     d->header.left = nullptr;
367     d->header.right = nullptr;
368     d->mostLeftNode = &(d->header);
369 
370     return d;
371 }
372 
freeData(QMapDataBase * d)373 void QMapDataBase::freeData(QMapDataBase *d)
374 {
375     delete d;
376 }
377 
378 /*!
379     \class QMap
380     \inmodule QtCore
381     \brief The QMap class is a template class that provides a red-black-tree-based dictionary.
382 
383     \ingroup tools
384     \ingroup shared
385 
386     \reentrant
387 
388     QMap\<Key, T\> is one of Qt's generic \l{container classes}. It
389     stores (key, value) pairs and provides fast lookup of the
390     value associated with a key.
391 
392     QMap and QHash provide very similar functionality. The
393     differences are:
394 
395     \list
396     \li QHash provides average faster lookups than QMap. (See \l{Algorithmic
397        Complexity} for details.)
398     \li When iterating over a QHash, the items are arbitrarily ordered.
399        With QMap, the items are always sorted by key.
400     \li The key type of a QHash must provide operator==() and a global
401        qHash(Key) function. The key type of a QMap must provide
402        operator<() specifying a total order. Since Qt 5.8.1 it is also safe
403        to use a pointer type as key, even if the underlying operator<()
404        does not provide a total order.
405     \endlist
406 
407     Here's an example QMap with QString keys and \c int values:
408     \snippet code/src_corelib_tools_qmap.cpp 0
409 
410     To insert a (key, value) pair into the map, you can use operator[]():
411 
412     \snippet code/src_corelib_tools_qmap.cpp 1
413 
414     This inserts the following three (key, value) pairs into the
415     QMap: ("one", 1), ("three", 3), and ("seven", 7). Another way to
416     insert items into the map is to use insert():
417 
418     \snippet code/src_corelib_tools_qmap.cpp 2
419 
420     To look up a value, use operator[]() or value():
421 
422     \snippet code/src_corelib_tools_qmap.cpp 3
423 
424     If there is no item with the specified key in the map, these
425     functions return a \l{default-constructed value}.
426 
427     If you want to check whether the map contains a certain key, use
428     contains():
429 
430     \snippet code/src_corelib_tools_qmap.cpp 4
431 
432     There is also a value() overload that uses its second argument as
433     a default value if there is no item with the specified key:
434 
435     \snippet code/src_corelib_tools_qmap.cpp 5
436 
437     In general, we recommend that you use contains() and value()
438     rather than operator[]() for looking up a key in a map. The
439     reason is that operator[]() silently inserts an item into the
440     map if no item exists with the same key (unless the map is
441     const). For example, the following code snippet will create 1000
442     items in memory:
443 
444     \snippet code/src_corelib_tools_qmap.cpp 6
445 
446     To avoid this problem, replace \c map[i] with \c map.value(i)
447     in the code above.
448 
449     If you want to navigate through all the (key, value) pairs stored
450     in a QMap, you can use an iterator. QMap provides both
451     \l{Java-style iterators} (QMapIterator and QMutableMapIterator)
452     and \l{STL-style iterators} (QMap::const_iterator and
453     QMap::iterator). Here's how to iterate over a QMap<QString, int>
454     using a Java-style iterator:
455 
456     \snippet code/src_corelib_tools_qmap.cpp 7
457 
458     Here's the same code, but using an STL-style iterator this time:
459 
460     \snippet code/src_corelib_tools_qmap.cpp 8
461 
462     The items are traversed in ascending key order.
463 
464     Normally, a QMap allows only one value per key. If you call
465     insert() with a key that already exists in the QMap, the
466     previous value will be erased. For example:
467 
468     \snippet code/src_corelib_tools_qmap.cpp 9
469 
470     However, you can store multiple values per key by using
471     using the subclass QMultiMap. If you want
472     to retrieve all the values for a single key, you can use
473     values(const Key &key), which returns a QList<T>:
474 
475     \snippet code/src_corelib_tools_qmap.cpp 10
476 
477     The items that share the same key are available from most
478     recently to least recently inserted. Another approach is to call
479     find() to get the STL-style iterator for the first item with a
480     key and iterate from there:
481 
482     \snippet code/src_corelib_tools_qmap.cpp 11
483 
484     If you only need to extract the values from a map (not the keys),
485     you can also use \l{foreach}:
486 
487     \snippet code/src_corelib_tools_qmap.cpp 12
488 
489     Items can be removed from the map in several ways. One way is to
490     call remove(); this will remove any item with the given key.
491     Another way is to use QMutableMapIterator::remove(). In addition,
492     you can clear the entire map using clear().
493 
494     QMap's key and value data types must be \l{assignable data
495     types}. This covers most data types you are likely to encounter,
496     but the compiler won't let you, for example, store a QWidget as a
497     value; instead, store a QWidget *. In addition, QMap's key type
498     must provide operator<(). QMap uses it to keep its items sorted,
499     and assumes that two keys \c x and \c y are equal if neither \c{x
500     < y} nor \c{y < x} is true.
501 
502     Example:
503     \snippet code/src_corelib_tools_qmap.cpp 13
504 
505     In the example, we start by comparing the employees' names. If
506     they're equal, we compare their dates of birth to break the tie.
507 
508     \sa QMapIterator, QMutableMapIterator, QHash, QSet
509 */
510 
511 /*! \fn template <class Key, class T> QMap<Key, T>::QMap()
512 
513     Constructs an empty map.
514 
515     \sa clear()
516 */
517 
518 /*!
519     \fn template <class Key, class T> QMap<Key, T>::QMap(QMap<Key, T> &&other)
520 
521     Move-constructs a QMap instance, making it point at the same
522     object that \a other was pointing to.
523 
524     \since 5.2
525 */
526 
527 /*! \fn template <class Key, class T> QMap<Key, T>::QMap(const QMap<Key, T> &other)
528 
529     Constructs a copy of \a other.
530 
531     This operation occurs in \l{constant time}, because QMap is
532     \l{implicitly shared}. This makes returning a QMap from a
533     function very fast. If a shared instance is modified, it will be
534     copied (copy-on-write), and this takes \l{linear time}.
535 
536     \sa operator=()
537 */
538 
539 /*! \fn template <class Key, class T> QMap<Key, T>::QMap(const typename std::map<Key, T> & other)
540 
541     Constructs a copy of \a other.
542 
543     \sa toStdMap()
544 */
545 
546 /*! \fn template <class Key, class T> QMap<Key, T>::QMap(std::initializer_list<std::pair<Key,T> > list)
547     \since 5.1
548 
549     Constructs a map with a copy of each of the elements in the
550     initializer list \a list.
551 
552     This function is only available if the program is being
553     compiled in C++11 mode.
554 */
555 
556 /*! \fn template <class Key, class T> std::map<Key, T> QMap<Key, T>::toStdMap() const
557 
558     Returns an STL map equivalent to this QMap.
559 */
560 
561 /*! \fn template <class Key, class T> QMap<Key, T>::~QMap()
562 
563     Destroys the map. References to the values in the map, and all
564     iterators over this map, become invalid.
565 */
566 
567 /*! \fn template <class Key, class T> QMap<Key, T> &QMap<Key, T>::operator=(const QMap<Key, T> &other)
568 
569     Assigns \a other to this map and returns a reference to this map.
570 */
571 
572 /*!
573     \fn template <class Key, class T> QMap<Key, T> &QMap<Key, T>::operator=(QMap<Key, T> &&other)
574 
575     Move-assigns \a other to this QMap instance.
576 
577     \since 5.2
578 */
579 
580 /*! \fn template <class Key, class T> void QMap<Key, T>::swap(QMap<Key, T> &other)
581     \since 4.8
582 
583     Swaps map \a other with this map. This operation is very
584     fast and never fails.
585 */
586 
587 /*! \fn template <class Key, class T> void QMultiMap<Key, T>::swap(QMultiMap<Key, T> &other)
588     \since 4.8
589 
590     Swaps map \a other with this map. This operation is very
591     fast and never fails.
592 */
593 
594 /*! \fn template <class Key, class T> bool QMap<Key, T>::operator==(const QMap<Key, T> &other) const
595 
596     Returns \c true if \a other is equal to this map; otherwise returns
597     false.
598 
599     Two maps are considered equal if they contain the same (key,
600     value) pairs.
601 
602     This function requires the value type to implement \c
603     operator==().
604 
605     \sa operator!=()
606 */
607 
608 /*! \fn template <class Key, class T> bool QMap<Key, T>::operator!=(const QMap<Key, T> &other) const
609 
610     Returns \c true if \a other is not equal to this map; otherwise
611     returns \c false.
612 
613     Two maps are considered equal if they contain the same (key,
614     value) pairs.
615 
616     This function requires the value type to implement \c
617     operator==().
618 
619     \sa operator==()
620 */
621 
622 /*! \fn template <class Key, class T> int QMap<Key, T>::size() const
623 
624     Returns the number of (key, value) pairs in the map.
625 
626     \sa isEmpty(), count()
627 */
628 
629 /*!
630     \fn template <class Key, class T> bool QMap<Key, T>::isEmpty() const
631 
632     Returns \c true if the map contains no items; otherwise returns
633     false.
634 
635     \sa size()
636 */
637 
638 /*! \fn template <class Key, class T> void QMap<Key, T>::detach()
639 
640     \internal
641 
642     Detaches this map from any other maps with which it may share
643     data.
644 
645     \sa isDetached()
646 */
647 
648 /*! \fn template <class Key, class T> bool QMap<Key, T>::isDetached() const
649 
650     \internal
651 
652     Returns \c true if the map's internal data isn't shared with any
653     other map object; otherwise returns \c false.
654 
655     \sa detach()
656 */
657 
658 /*! \fn template <class Key, class T> void QMap<Key, T>::setSharable(bool sharable)
659 
660     \internal
661 */
662 
663 /*! \fn template <class Key, class T> bool QMap<Key, T>::isSharedWith(const QMap<Key, T> &other) const
664 
665     \internal
666 */
667 
668 /*! \fn template <class Key, class T> void QMap<Key, T>::clear()
669 
670     Removes all items from the map.
671 
672     \sa remove()
673 */
674 
675 /*! \fn template <class Key, class T> int QMap<Key, T>::remove(const Key &key)
676 
677     Removes all the items that have the key \a key from the map.
678     Returns the number of items removed which will be 1 if the key
679     exists in the map, and 0 otherwise.
680 
681     \sa clear(), take(), QMultiMap::remove()
682 */
683 
684 /*! \fn template <class Key, class T> T QMap<Key, T>::take(const Key &key)
685 
686     Removes the item with the key \a key from the map and returns
687     the value associated with it.
688 
689     If the item does not exist in the map, the function simply
690     returns a \l{default-constructed value}. If there are multiple
691     items for \a key in the map, only the most recently inserted one
692     is removed and returned.
693 
694     If you don't use the return value, remove() is more efficient.
695 
696     \sa remove()
697 */
698 
699 /*! \fn template <class Key, class T> bool QMap<Key, T>::contains(const Key &key) const
700 
701     Returns \c true if the map contains an item with key \a key;
702     otherwise returns \c false.
703 
704     \sa count(), QMultiMap::contains()
705 */
706 
707 /*! \fn template <class Key, class T> const T QMap<Key, T>::value(const Key &key, const T &defaultValue) const
708 
709     Returns the value associated with the key \a key.
710 
711     If the map contains no item with key \a key, the function returns
712     \a defaultValue. If no \a defaultValue is specified, the function
713     returns a \l{default-constructed value}. If there are multiple
714     items for \a key in the map, the value of the most recently
715     inserted one is returned.
716 
717     \sa key(), values(), contains(), operator[]()
718 */
719 
720 /*! \fn template <class Key, class T> T &QMap<Key, T>::operator[](const Key &key)
721 
722     Returns the value associated with the key \a key as a modifiable
723     reference.
724 
725     If the map contains no item with key \a key, the function inserts
726     a \l{default-constructed value} into the map with key \a key, and
727     returns a reference to it. If the map contains multiple items
728     with key \a key, this function returns a reference to the most
729     recently inserted value.
730 
731     \sa insert(), value()
732 */
733 
734 /*! \fn template <class Key, class T> const T QMap<Key, T>::operator[](const Key &key) const
735 
736     \overload
737 
738     Same as value().
739 */
740 
741 /*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::uniqueKeys() const
742     \since 4.2
743     \obsolete Use QMultiMap for storing multiple values with the same key.
744 
745     Returns a list containing all the keys in the map in ascending
746     order. Keys that occur multiple times in the map (because items
747     were inserted with insertMulti(), or unite() was used) occur only
748     once in the returned list.
749 
750     \sa QMultiMap::uniqueKeys()
751 */
752 
753 /*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::keys() const
754 
755     Returns a list containing all the keys in the map in ascending
756     order. Keys that occur multiple times in the map (because the
757     method is operating on a QMultiMap) also occur multiple times
758     in the list.
759 
760     The order is guaranteed to be the same as that used by values().
761 
762     \sa QMultiMap::uniqueKeys(), values(), key()
763 */
764 
765 /*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::keys(const T &value) const
766 
767     \overload
768 
769     Returns a list containing all the keys associated with value \a
770     value in ascending order.
771 
772     This function can be slow (\l{linear time}), because QMap's
773     internal data structure is optimized for fast lookup by key, not
774     by value.
775 */
776 
777 /*!
778     \fn template <class Key, class T> Key QMap<Key, T>::key(const T &value, const Key &defaultKey) const
779     \since 4.3
780     \overload
781 
782     Returns the first key with value \a value, or \a defaultKey if
783     the map contains no item with value \a value. If no \a defaultKey
784     is provided the function returns a
785     \l{default-constructed value}{default-constructed key}.
786 
787     This function can be slow (\l{linear time}), because QMap's
788     internal data structure is optimized for fast lookup by key, not
789     by value.
790 
791     \sa value(), keys()
792 */
793 
794 /*! \fn template <class Key, class T> QList<T> QMap<Key, T>::values() const
795 
796     Returns a list containing all the values in the map, in ascending
797     order of their keys. If a key is associated with multiple values,
798     all of its values will be in the list, and not just the most
799     recently inserted one.
800 
801     \sa keys(), value()
802 */
803 
804 /*! \fn template <class Key, class T> QList<T> QMap<Key, T>::values(const Key &key) const
805     \overload
806     \obsolete Use QMultiMap for maps storing multiple values with the same key.
807 
808     Returns a list containing all the values associated with key
809     \a key, from the most recently inserted to the least recently
810     inserted one.
811 
812     \sa QMultiMap::values()
813 */
814 
815 /*! \fn template <class Key, class T> int QMap<Key, T>::count(const Key &key) const
816 
817     Returns the number of items associated with key \a key.
818 
819     \sa contains(), QMultiMap::count()
820 */
821 
822 /*! \fn template <class Key, class T> int QMap<Key, T>::count() const
823 
824     \overload
825 
826     Same as size().
827 */
828 
829 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::begin()
830 
831     Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in
832     the map.
833 
834     \sa constBegin(), end()
835 */
836 
837 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::begin() const
838 
839     \overload
840 */
841 
842 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::cbegin() const
843     \since 5.0
844 
845     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
846     in the map.
847 
848     \sa begin(), cend()
849 */
850 
851 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::constBegin() const
852 
853     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first item
854     in the map.
855 
856     \sa begin(), constEnd()
857 */
858 
859 /*! \fn template <class Key, class T> QMap<Key, T>::key_iterator QMap<Key, T>::keyBegin() const
860     \since 5.6
861 
862     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first key
863     in the map.
864 
865     \sa keyEnd(), firstKey()
866 */
867 
868 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::end()
869 
870     Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item
871     after the last item in the map.
872 
873     \sa begin(), constEnd()
874 */
875 
876 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::end() const
877 
878     \overload
879 */
880 
881 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::cend() const
882     \since 5.0
883 
884     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
885     item after the last item in the map.
886 
887     \sa cbegin(), end()
888 */
889 
890 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::constEnd() const
891 
892     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
893     item after the last item in the map.
894 
895     \sa constBegin(), end()
896 */
897 
898 /*! \fn template <class Key, class T> QMap<Key, T>::key_iterator QMap<Key, T>::keyEnd() const
899     \since 5.6
900 
901     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
902     item after the last key in the map.
903 
904     \sa keyBegin(), lastKey()
905 */
906 
907 
908 /*! \fn template <class Key, class T> QMap<Key, T>::key_value_iterator QMap<Key, T>::keyValueBegin()
909     \since 5.10
910 
911     Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first entry
912     in the map.
913 
914     \sa keyValueEnd()
915 */
916 
917 /*! \fn template <class Key, class T> QMap<Key, T>::key_value_iterator QMap<Key, T>::keyValueEnd()
918     \since 5.10
919 
920     Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
921     entry after the last entry in the map.
922 
923     \sa keyValueBegin()
924 */
925 
926 /*! \fn template <class Key, class T> QMap<Key, T>::const_key_value_iterator QMap<Key, T>::keyValueBegin() const
927     \since 5.10
928 
929     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
930     in the map.
931 
932     \sa keyValueEnd()
933 */
934 
935 /*! \fn template <class Key, class T> QMap<Key, T>::const_key_value_iterator QMap<Key, T>::constKeyValueBegin() const
936     \since 5.10
937 
938     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first entry
939     in the map.
940 
941     \sa keyValueBegin()
942 */
943 
944 /*! \fn template <class Key, class T> QMap<Key, T>::const_key_value_iterator QMap<Key, T>::keyValueEnd() const
945     \since 5.10
946 
947     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
948     entry after the last entry in the map.
949 
950     \sa keyValueBegin()
951 */
952 
953 /*! \fn template <class Key, class T> QMap<Key, T>::const_key_value_iterator QMap<Key, T>::constKeyValueEnd() const
954     \since 5.10
955 
956     Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
957     entry after the last entry in the map.
958 
959     \sa constKeyValueBegin()
960 */
961 
962 /*! \fn template <class Key, class T> const Key &QMap<Key, T>::firstKey() const
963     \since 5.2
964 
965     Returns a reference to the smallest key in the map.
966     This function assumes that the map is not empty.
967 
968     This executes in \l{constant time}.
969 
970     \sa lastKey(), first(), keyBegin(), isEmpty()
971 */
972 
973 /*! \fn template <class Key, class T> const Key &QMap<Key, T>::lastKey() const
974     \since 5.2
975 
976     Returns a reference to the largest key in the map.
977     This function assumes that the map is not empty.
978 
979     This executes in \l{logarithmic time}.
980 
981     \sa firstKey(), last(), keyEnd(), isEmpty()
982 */
983 
984 /*! \fn template <class Key, class T> T &QMap<Key, T>::first()
985     \since 5.2
986 
987     Returns a reference to the first value in the map, that is the value mapped
988     to the smallest key. This function assumes that the map is not empty.
989 
990     When unshared (or const version is called), this executes in \l{constant time}.
991 
992     \sa last(), firstKey(), isEmpty()
993 */
994 
995 /*! \fn template <class Key, class T> const T &QMap<Key, T>::first() const
996     \since 5.2
997 
998     \overload
999 */
1000 
1001 /*! \fn template <class Key, class T> T &QMap<Key, T>::last()
1002     \since 5.2
1003 
1004     Returns a reference to the last value in the map, that is the value mapped
1005     to the largest key. This function assumes that the map is not empty.
1006 
1007     When unshared (or const version is called), this executes in \l{logarithmic time}.
1008 
1009     \sa first(), lastKey(), isEmpty()
1010 */
1011 
1012 /*! \fn template <class Key, class T> const T &QMap<Key, T>::last() const
1013     \since 5.2
1014 
1015     \overload
1016 */
1017 
1018 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::erase(iterator pos)
1019 
1020     Removes the (key, value) pair pointed to by the iterator \a pos
1021     from the map, and returns an iterator to the next item in the
1022     map.
1023 
1024     \sa remove()
1025 */
1026 
1027 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::find(const Key &key)
1028 
1029     Returns an iterator pointing to the item with key \a key in the
1030     map.
1031 
1032     If the map contains no item with key \a key, the function
1033     returns end().
1034 
1035     If the map contains multiple items with key \a key, this
1036     function returns an iterator that points to the most recently
1037     inserted value. The other values are accessible by incrementing
1038     the iterator. For example, here's some code that iterates over all
1039     the items with the same key:
1040 
1041     \snippet code/src_corelib_tools_qmap.cpp 14
1042 
1043     \sa constFind(), value(), values(), lowerBound(), upperBound(), QMultiMap::find()
1044 */
1045 
1046 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::find(const Key &key) const
1047 
1048     \overload
1049 */
1050 
1051 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::constFind(const Key &key) const
1052     \since 4.1
1053 
1054     Returns an const iterator pointing to the item with key \a key in the
1055     map.
1056 
1057     If the map contains no item with key \a key, the function
1058     returns constEnd().
1059 
1060     \sa find(), QMultiMap::constFind()
1061 */
1062 
1063 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::lowerBound(const Key &key)
1064 
1065     Returns an iterator pointing to the first item with key \a key in
1066     the map. If the map contains no item with key \a key, the
1067     function returns an iterator to the nearest item with a greater
1068     key.
1069 
1070     Example:
1071     \snippet code/src_corelib_tools_qmap.cpp 15
1072 
1073     If the map contains multiple items with key \a key, this
1074     function returns an iterator that points to the most recently
1075     inserted value. The other values are accessible by incrementing
1076     the iterator. For example, here's some code that iterates over all
1077     the items with the same key:
1078 
1079     \snippet code/src_corelib_tools_qmap.cpp 16
1080 
1081     \sa upperBound(), find()
1082 */
1083 
1084 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::lowerBound(const Key &key) const
1085 
1086     \overload
1087 */
1088 
1089 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::upperBound(const Key &key)
1090 
1091     Returns an iterator pointing to the item that immediately follows
1092     the last item with key \a key in the map. If the map contains no
1093     item with key \a key, the function returns an iterator to the
1094     nearest item with a greater key.
1095 
1096     Example:
1097     \snippet code/src_corelib_tools_qmap.cpp 17
1098 
1099     \sa lowerBound(), find()
1100 */
1101 
1102 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::upperBound(const Key &key) const
1103 
1104     \overload
1105 */
1106 
1107 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insert(const Key &key, const T &value)
1108 
1109     Inserts a new item with the key \a key and a value of \a value.
1110 
1111     If there is already an item with the key \a key, that item's value
1112     is replaced with \a value.
1113 
1114     If there are multiple items with the key \a key, the most
1115     recently inserted item's value is replaced with \a value.
1116 
1117     \sa QMultiMap::insert()
1118 */
1119 
1120 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insert(const_iterator pos, const Key &key, const T &value)
1121     \overload
1122     \since 5.1
1123     Inserts a new item with the key \a key and value \a value and with hint \a pos
1124     suggesting where to do the insert.
1125 
1126     If constBegin() is used as hint it indicates that the \a key is less than any key in the map
1127     while constEnd() suggests that the \a key is (strictly) larger than any key in the map.
1128     Otherwise the hint should meet the condition (\a pos - 1).key() < \a key <= pos.key().
1129     If the hint \a pos is wrong it is ignored and a regular insert is done.
1130 
1131     If there is already an item with the key \a key, that item's value
1132     is replaced with \a value.
1133 
1134     If there are multiple items with the key \a key, then exactly one of them
1135     is replaced with \a value.
1136 
1137     If the hint is correct and the map is unshared, the insert executes in amortized \l{constant time}.
1138 
1139     When creating a map from sorted data inserting the largest key first with constBegin()
1140     is faster than inserting in sorted order with constEnd(), since constEnd() - 1 (which is needed
1141     to check if the hint is valid) needs \l{logarithmic time}.
1142 
1143     \b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
1144     crash but there is also a risk that it will silently corrupt both the map and the \a pos map.
1145 
1146     \sa QMultiMap::insert()
1147 */
1148 
1149 /*! \fn template <class Key, class T> void QMap<Key, T>::insert(const QMap<Key, T> &map)
1150     \since 5.15
1151 
1152     Inserts all the items in \a map into this map.
1153 
1154     If a key is common to both maps, its value will be replaced with
1155     the value stored in \a map.
1156 
1157     \note If \a map contains multiple entries with the same key then the
1158     final value of the key is undefined.
1159 
1160     \sa QMultiMap::insert()
1161 */
1162 
1163 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const Key &key, const T &value)
1164     \obsolete Use QMultiMap for storing multiple values with the same key.
1165 
1166     Inserts a new item with the key \a key and a value of \a value.
1167 
1168     If there is already an item with the same key in the map, this
1169     function will simply create a new one. (This behavior is
1170     different from insert(), which overwrites the value of an
1171     existing item.)
1172 
1173     \sa QMultiMap::insert()
1174 */
1175 
1176 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const_iterator pos, const Key &key, const T &value)
1177     \overload
1178     \since 5.1
1179     \obsolete Use QMultiMap for storing multiple values with the same key.
1180     Inserts a new item with the key \a key and value \a value and with hint \a pos
1181     suggesting where to do the insert.
1182 
1183     If constBegin() is used as hint it indicates that the \a key is less than any key in the map
1184     while constEnd() suggests that the \a key is larger than any key in the map.
1185     Otherwise the hint should meet the condition (\a pos - 1).key() < \a key <= pos.key().
1186     If the hint \a pos is wrong it is ignored and a regular insertMulti is done.
1187 
1188     If there is already an item with the same key in the map, this function will simply create a new one.
1189 
1190     \b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
1191     crash but there is also a risk that it will silently corrupt both the map and the \a pos map.
1192 
1193     \sa QMultiMap::insert()
1194 */
1195 
1196 
1197 /*! \fn template <class Key, class T> QMap<Key, T> &QMap<Key, T>::unite(const QMap<Key, T> &other)
1198     \obsolete Use QMultiMap for storing multiple values with the same key.
1199 
1200     Inserts all the items in the \a other map into this map. If a
1201     key is common to both maps, the resulting map will contain the
1202     key multiple times.
1203 
1204     \sa QMultiMap::unite()
1205 */
1206 
1207 /*! \typedef QMap::Iterator
1208 
1209     Qt-style synonym for QMap<Key, T>::iterator.
1210 */
1211 
1212 /*! \typedef QMap::ConstIterator
1213 
1214     Qt-style synonym for QMap<Key, T>::const_iterator.
1215 */
1216 
1217 /*! \typedef QMap::difference_type
1218 
1219     Typedef for ptrdiff_t. Provided for STL compatibility.
1220 */
1221 
1222 /*! \typedef QMap::key_type
1223 
1224     Typedef for Key. Provided for STL compatibility.
1225 */
1226 
1227 /*! \typedef QMap::mapped_type
1228 
1229     Typedef for T. Provided for STL compatibility.
1230 */
1231 
1232 /*! \typedef QMap::size_type
1233 
1234     Typedef for int. Provided for STL compatibility.
1235 */
1236 
1237 /*!
1238     \fn template <class Key, class T> bool QMap<Key, T>::empty() const
1239 
1240     This function is provided for STL compatibility. It is equivalent
1241     to isEmpty(), returning true if the map is empty; otherwise
1242     returning false.
1243 */
1244 
1245 /*!
1246   \fn template <class Key, class T> QPair<typename QMap<Key, T>::iterator, typename QMap<Key, T>::iterator> QMap<Key, T>::equal_range(const Key &key)
1247 
1248   Returns a pair of iterators delimiting the range of values \c{[first, second)}, that
1249   are stored under \a key.
1250 */
1251 
1252 /*!
1253     \fn template <class Key, class T> QPair<typename QMap<Key, T>::const_iterator, typename QMap<Key, T>::const_iterator> QMap<Key, T>::equal_range(const Key &key) const
1254     \overload
1255     \since 5.6
1256 */
1257 
1258 
1259 /*! \class QMap::iterator
1260     \inmodule QtCore
1261     \brief The QMap::iterator class provides an STL-style non-const iterator for QMap and QMultiMap.
1262 
1263     QMap features both \l{STL-style iterators} and \l{Java-style
1264     iterators}. The STL-style iterators are more low-level and more
1265     cumbersome to use; on the other hand, they are slightly faster
1266     and, for developers who already know STL, have the advantage of
1267     familiarity.
1268 
1269     QMap\<Key, T\>::iterator allows you to iterate over a QMap (or
1270     QMultiMap) and to modify the value (but not the key) stored under
1271     a particular key. If you want to iterate over a const QMap, you
1272     should use QMap::const_iterator. It is generally good practice to
1273     use QMap::const_iterator on a non-const QMap as well, unless you
1274     need to change the QMap through the iterator. Const iterators are
1275     slightly faster, and can improve code readability.
1276 
1277     The default QMap::iterator constructor creates an uninitialized
1278     iterator. You must initialize it using a QMap function like
1279     QMap::begin(), QMap::end(), or QMap::find() before you can
1280     start iterating. Here's a typical loop that prints all the (key,
1281     value) pairs stored in a map:
1282 
1283     \snippet code/src_corelib_tools_qmap.cpp 18
1284 
1285     Unlike QHash, which stores its items in an arbitrary order, QMap
1286     stores its items ordered by key. Items that share the same key
1287     (because the map is a QMultiMap) will appear consecutively,
1288     from the most recently to the least recently inserted value.
1289 
1290     Let's see a few examples of things we can do with a
1291     QMap::iterator that we cannot do with a QMap::const_iterator.
1292     Here's an example that increments every value stored in the QMap
1293     by 2:
1294 
1295     \snippet code/src_corelib_tools_qmap.cpp 19
1296 
1297     Here's an example that removes all the items whose key is a
1298     string that starts with an underscore character:
1299 
1300     \snippet code/src_corelib_tools_qmap.cpp 20
1301 
1302     The call to QMap::erase() removes the item pointed to by the
1303     iterator from the map, and returns an iterator to the next item.
1304     Here's another way of removing an item while iterating:
1305 
1306     \snippet code/src_corelib_tools_qmap.cpp 21
1307 
1308     It might be tempting to write code like this:
1309 
1310     \snippet code/src_corelib_tools_qmap.cpp 22
1311 
1312     However, this will potentially crash in \c{++i}, because \c i is
1313     a dangling iterator after the call to erase().
1314 
1315     Multiple iterators can be used on the same map. If you add items
1316     to the map, existing iterators will remain valid. If you remove
1317     items from the map, iterators that point to the removed items
1318     will become dangling iterators.
1319 
1320     \warning Iterators on implicitly shared containers do not work
1321     exactly like STL-iterators. You should avoid copying a container
1322     while iterators are active on that container. For more information,
1323     read \l{Implicit sharing iterator problem}.
1324 
1325     \sa QMap::const_iterator, QMap::key_iterator, QMutableMapIterator
1326 */
1327 
1328 /*! \typedef QMap::iterator::difference_type
1329 
1330     \internal
1331 */
1332 
1333 /*! \typedef QMap::iterator::iterator_category
1334 
1335   A synonym for \e {std::bidirectional_iterator_tag} indicating
1336   this iterator is a bidirectional iterator.
1337 */
1338 
1339 /*! \typedef QMap::iterator::pointer
1340 
1341     \internal
1342 */
1343 
1344 /*! \typedef QMap::iterator::reference
1345 
1346     \internal
1347 */
1348 
1349 /*! \typedef QMap::iterator::value_type
1350 
1351     \internal
1352 */
1353 
1354 /*! \fn template <class Key, class T> QMap<Key, T>::iterator::iterator()
1355 
1356     Constructs an uninitialized iterator.
1357 
1358     Functions like key(), value(), and operator++() must not be
1359     called on an uninitialized iterator. Use operator=() to assign a
1360     value to it before using it.
1361 
1362     \sa QMap::begin(), QMap::end()
1363 */
1364 
1365 /*! \fn template <class Key, class T> QMap<Key, T>::iterator::iterator(Node *)
1366 
1367     \internal
1368 */
1369 
1370 /*! \fn template <class Key, class T> const Key &QMap<Key, T>::iterator::key() const
1371 
1372     Returns the current item's key as a const reference.
1373 
1374     There is no direct way of changing an item's key through an
1375     iterator, although it can be done by calling QMap::erase()
1376     followed by QMap::insert() or QMap::insertMulti().
1377 
1378     \sa value()
1379 */
1380 
1381 /*! \fn template <class Key, class T> T &QMap<Key, T>::iterator::value() const
1382 
1383     Returns a modifiable reference to the current item's value.
1384 
1385     You can change the value of an item by using value() on
1386     the left side of an assignment, for example:
1387 
1388     \snippet code/src_corelib_tools_qmap.cpp 23
1389 
1390     \sa key(), operator*()
1391 */
1392 
1393 /*! \fn template <class Key, class T> T &QMap<Key, T>::iterator::operator*() const
1394 
1395     Returns a modifiable reference to the current item's value.
1396 
1397     Same as value().
1398 
1399     \sa key()
1400 */
1401 
1402 /*! \fn template <class Key, class T> T *QMap<Key, T>::iterator::operator->() const
1403 
1404     Returns a pointer to the current item's value.
1405 
1406     \sa value()
1407 */
1408 
1409 /*!
1410     \fn template <class Key, class T> bool QMap<Key, T>::iterator::operator==(const iterator &other) const
1411     \fn template <class Key, class T> bool QMap<Key, T>::iterator::operator==(const const_iterator &other) const
1412 
1413     Returns \c true if \a other points to the same item as this
1414     iterator; otherwise returns \c false.
1415 
1416     \sa operator!=()
1417 */
1418 
1419 /*!
1420     \fn template <class Key, class T> bool QMap<Key, T>::iterator::operator!=(const iterator &other) const
1421     \fn template <class Key, class T> bool QMap<Key, T>::iterator::operator!=(const const_iterator &other) const
1422 
1423     Returns \c true if \a other points to a different item than this
1424     iterator; otherwise returns \c false.
1425 
1426     \sa operator==()
1427 */
1428 
1429 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator++()
1430 
1431     The prefix ++ operator (\c{++i}) advances the iterator to the
1432     next item in the map and returns an iterator to the new current
1433     item.
1434 
1435     Calling this function on QMap::end() leads to undefined results.
1436 
1437     \sa operator--()
1438 */
1439 
1440 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator++(int)
1441 
1442     \overload
1443 
1444     The postfix ++ operator (\c{i++}) advances the iterator to the
1445     next item in the map and returns an iterator to the previously
1446     current item.
1447 */
1448 
1449 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator--()
1450 
1451     The prefix -- operator (\c{--i}) makes the preceding item
1452     current and returns an iterator pointing to the new current item.
1453 
1454     Calling this function on QMap::begin() leads to undefined
1455     results.
1456 
1457     \sa operator++()
1458 */
1459 
1460 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator--(int)
1461 
1462     \overload
1463 
1464     The postfix -- operator (\c{i--}) makes the preceding item
1465     current and returns an iterator pointing to the previously
1466     current item.
1467 */
1468 
1469 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator+(int j) const
1470 
1471     Returns an iterator to the item at \a j positions forward from
1472     this iterator. (If \a j is negative, the iterator goes backward.)
1473 
1474     This operation can be slow for large \a j values.
1475 
1476     \sa operator-()
1477 
1478 */
1479 
1480 /*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::iterator::operator-(int j) const
1481 
1482     Returns an iterator to the item at \a j positions backward from
1483     this iterator. (If \a j is negative, the iterator goes forward.)
1484 
1485     This operation can be slow for large \a j values.
1486 
1487     \sa operator+()
1488 */
1489 
1490 /*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator+=(int j)
1491 
1492     Advances the iterator by \a j items. (If \a j is negative, the
1493     iterator goes backward.)
1494 
1495     \sa operator-=(), operator+()
1496 */
1497 
1498 /*! \fn template <class Key, class T> QMap<Key, T>::iterator &QMap<Key, T>::iterator::operator-=(int j)
1499 
1500     Makes the iterator go back by \a j items. (If \a j is negative,
1501     the iterator goes forward.)
1502 
1503     \sa operator+=(), operator-()
1504 */
1505 
1506 /*! \class QMap::const_iterator
1507     \inmodule QtCore
1508     \brief The QMap::const_iterator class provides an STL-style const iterator for QMap and QMultiMap.
1509 
1510     QMap features both \l{STL-style iterators} and \l{Java-style
1511     iterators}. The STL-style iterators are more low-level and more
1512     cumbersome to use; on the other hand, they are slightly faster
1513     and, for developers who already know STL, have the advantage of
1514     familiarity.
1515 
1516     QMap\<Key, T\>::const_iterator allows you to iterate over a QMap
1517     (or a QMultiMap). If you want to modify the QMap as you iterate
1518     over it, you must use QMap::iterator instead. It is generally
1519     good practice to use QMap::const_iterator on a non-const QMap as
1520     well, unless you need to change the QMap through the iterator.
1521     Const iterators are slightly faster, and can improve code
1522     readability.
1523 
1524     The default QMap::const_iterator constructor creates an
1525     uninitialized iterator. You must initialize it using a QMap
1526     function like QMap::constBegin(), QMap::constEnd(), or
1527     QMap::find() before you can start iterating. Here's a typical
1528     loop that prints all the (key, value) pairs stored in a map:
1529 
1530     \snippet code/src_corelib_tools_qmap.cpp 24
1531 
1532     Unlike QHash, which stores its items in an arbitrary order, QMap
1533     stores its items ordered by key. Items that share the same key
1534     (because the map is a QMultiMap) will appear consecutively,
1535     from the most recently to the least recently inserted value.
1536 
1537     Multiple iterators can be used on the same map. If you add items
1538     to the map, existing iterators will remain valid. If you remove
1539     items from the map, iterators that point to the removed items
1540     will become dangling iterators.
1541 
1542     \warning Iterators on implicitly shared containers do not work
1543     exactly like STL-iterators. You should avoid copying a container
1544     while iterators are active on that container. For more information,
1545     read \l{Implicit sharing iterator problem}.
1546 
1547     \sa QMap::iterator, QMap::key_iterator, QMapIterator
1548 */
1549 
1550 /*! \typedef QMap::const_iterator::difference_type
1551 
1552     \internal
1553 */
1554 
1555 /*! \typedef QMap::const_iterator::iterator_category
1556 
1557   A synonym for \e {std::bidirectional_iterator_tag} indicating
1558   this iterator is a bidirectional iterator.
1559 */
1560 
1561 /*! \typedef QMap::const_iterator::pointer
1562 
1563     \internal
1564 */
1565 
1566 /*! \typedef QMap::const_iterator::reference
1567 
1568     \internal
1569 */
1570 
1571 /*! \typedef QMap::const_iterator::value_type
1572 
1573     \internal
1574 */
1575 
1576 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator::const_iterator()
1577 
1578     Constructs an uninitialized iterator.
1579 
1580     Functions like key(), value(), and operator++() must not be
1581     called on an uninitialized iterator. Use operator=() to assign a
1582     value to it before using it.
1583 
1584     \sa QMap::constBegin(), QMap::constEnd()
1585 */
1586 
1587 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator::const_iterator(const Node *)
1588 
1589     \internal
1590 */
1591 
1592 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator::const_iterator(const iterator &other)
1593 
1594     Constructs a copy of \a other.
1595 */
1596 
1597 /*! \fn template <class Key, class T> const Key &QMap<Key, T>::const_iterator::key() const
1598 
1599     Returns the current item's key.
1600 
1601     \sa value()
1602 */
1603 
1604 /*! \fn template <class Key, class T> const T &QMap<Key, T>::const_iterator::value() const
1605 
1606     Returns the current item's value.
1607 
1608     \sa key(), operator*()
1609 */
1610 
1611 /*! \fn template <class Key, class T> const T &QMap<Key, T>::const_iterator::operator*() const
1612 
1613     Returns the current item's value.
1614 
1615     Same as value().
1616 
1617     \sa key()
1618 */
1619 
1620 /*! \fn template <class Key, class T> const T *QMap<Key, T>::const_iterator::operator->() const
1621 
1622     Returns a pointer to the current item's value.
1623 
1624     \sa value()
1625 */
1626 
1627 /*! \fn template <class Key, class T> bool QMap<Key, T>::const_iterator::operator==(const const_iterator &other) const
1628 
1629     Returns \c true if \a other points to the same item as this
1630     iterator; otherwise returns \c false.
1631 
1632     \sa operator!=()
1633 */
1634 
1635 /*! \fn template <class Key, class T> bool QMap<Key, T>::const_iterator::operator!=(const const_iterator &other) const
1636 
1637     Returns \c true if \a other points to a different item than this
1638     iterator; otherwise returns \c false.
1639 
1640     \sa operator==()
1641 */
1642 
1643 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator++()
1644 
1645     The prefix ++ operator (\c{++i}) advances the iterator to the
1646     next item in the map and returns an iterator to the new current
1647     item.
1648 
1649     Calling this function on QMap::end() leads to undefined results.
1650 
1651     \sa operator--()
1652 */
1653 
1654 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator++(int)
1655 
1656     \overload
1657 
1658     The postfix ++ operator (\c{i++}) advances the iterator to the
1659     next item in the map and returns an iterator to the previously
1660     current item.
1661 */
1662 
1663 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator--()
1664 
1665     The prefix -- operator (\c{--i}) makes the preceding item
1666     current and returns an iterator pointing to the new current item.
1667 
1668     Calling this function on QMap::begin() leads to undefined
1669     results.
1670 
1671     \sa operator++()
1672 */
1673 
1674 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator--(int)
1675 
1676     \overload
1677 
1678     The postfix -- operator (\c{i--}) makes the preceding item
1679     current and returns an iterator pointing to the previously
1680     current item.
1681 */
1682 
1683 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator+(int j) const
1684 
1685     Returns an iterator to the item at \a j positions forward from
1686     this iterator. (If \a j is negative, the iterator goes backward.)
1687 
1688     This operation can be slow for large \a j values.
1689 
1690     \sa operator-()
1691 */
1692 
1693 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator QMap<Key, T>::const_iterator::operator-(int j) const
1694 
1695     Returns an iterator to the item at \a j positions backward from
1696     this iterator. (If \a j is negative, the iterator goes forward.)
1697 
1698     This operation can be slow for large \a j values.
1699 
1700     \sa operator+()
1701 */
1702 
1703 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator+=(int j)
1704 
1705     Advances the iterator by \a j items. (If \a j is negative, the
1706     iterator goes backward.)
1707 
1708     This operation can be slow for large \a j values.
1709 
1710     \sa operator-=(), operator+()
1711 */
1712 
1713 /*! \fn template <class Key, class T> QMap<Key, T>::const_iterator &QMap<Key, T>::const_iterator::operator-=(int j)
1714 
1715     Makes the iterator go back by \a j items. (If \a j is negative,
1716     the iterator goes forward.)
1717 
1718     This operation can be slow for large \a j values.
1719 
1720     \sa operator+=(), operator-()
1721 */
1722 
1723 /*! \class QMap::key_iterator
1724     \inmodule QtCore
1725     \since 5.6
1726     \brief The QMap::key_iterator class provides an STL-style const iterator for QMap and QMultiMap keys.
1727 
1728     QMap::key_iterator is essentially the same as QMap::const_iterator
1729     with the difference that operator*() and operator->() return a key
1730     instead of a value.
1731 
1732     For most uses QMap::iterator and QMap::const_iterator should be used,
1733     you can easily access the key by calling QMap::iterator::key():
1734 
1735     \snippet code/src_corelib_tools_qmap.cpp keyiterator1
1736 
1737     However, to have interoperability between QMap's keys and STL-style
1738     algorithms we need an iterator that dereferences to a key instead
1739     of a value. With QMap::key_iterator we can apply an algorithm to a
1740     range of keys without having to call QMap::keys(), which is inefficient
1741     as it costs one QMap iteration and memory allocation to create a temporary
1742     QList.
1743 
1744     \snippet code/src_corelib_tools_qmap.cpp keyiterator2
1745 
1746     QMap::key_iterator is const, it's not possible to modify the key.
1747 
1748     The default QMap::key_iterator constructor creates an uninitialized
1749     iterator. You must initialize it using a QMap function like
1750     QMap::keyBegin() or QMap::keyEnd().
1751 
1752     \warning Iterators on implicitly shared containers do not work
1753     exactly like STL-iterators. You should avoid copying a container
1754     while iterators are active on that container. For more information,
1755     read \l{Implicit sharing iterator problem}.
1756 
1757     \sa QMap::const_iterator, QMap::iterator
1758 */
1759 
1760 /*! \typedef QMap::key_iterator::difference_type
1761     \internal
1762 */
1763 
1764 /*! \typedef QMap::key_iterator::iterator_category
1765     \internal
1766 */
1767 
1768 /*! \typedef QMap::key_iterator::pointer
1769     \internal
1770 */
1771 
1772 /*! \typedef QMap::key_iterator::reference
1773     \internal
1774 */
1775 
1776 /*! \typedef QMap::key_iterator::value_type
1777     \internal
1778 */
1779 
1780 /*! \fn template <class Key, class T> const T &QMap<Key, T>::key_iterator::operator*() const
1781 
1782     Returns the current item's key.
1783 */
1784 
1785 /*! \fn template <class Key, class T> const T *QMap<Key, T>::key_iterator::operator->() const
1786 
1787     Returns a pointer to the current item's key.
1788 */
1789 
1790 /*! \fn template <class Key, class T> bool QMap<Key, T>::key_iterator::operator==(key_iterator other) const
1791 
1792     Returns \c true if \a other points to the same item as this
1793     iterator; otherwise returns \c false.
1794 
1795     \sa operator!=()
1796 */
1797 
1798 /*! \fn template <class Key, class T> bool QMap<Key, T>::key_iterator::operator!=(key_iterator other) const
1799 
1800     Returns \c true if \a other points to a different item than this
1801     iterator; otherwise returns \c false.
1802 
1803     \sa operator==()
1804 */
1805 
1806 /*!
1807     \fn template <class Key, class T> QMap<Key, T>::key_iterator &QMap<Key, T>::key_iterator::operator++()
1808 
1809     The prefix ++ operator (\c{++i}) advances the iterator to the
1810     next item in the hash and returns an iterator to the new current
1811     item.
1812 
1813     Calling this function on QMap::keyEnd() leads to undefined results.
1814 
1815     \sa operator--()
1816 */
1817 
1818 /*! \fn template <class Key, class T> QMap<Key, T>::key_iterator QMap<Key, T>::key_iterator::operator++(int)
1819 
1820     \overload
1821 
1822     The postfix ++ operator (\c{i++}) advances the iterator to the
1823     next item in the hash and returns an iterator to the previous
1824     item.
1825 */
1826 
1827 /*! \fn template <class Key, class T> QMap<Key, T>::key_iterator &QMap<Key, T>::key_iterator::operator--()
1828 
1829     The prefix -- operator (\c{--i}) makes the preceding item
1830     current and returns an iterator pointing to the new current item.
1831 
1832     Calling this function on QMap::keyBegin() leads to undefined
1833     results.
1834 
1835     \sa operator++()
1836 */
1837 
1838 /*! \fn template <class Key, class T> QMap<Key, T>::key_iterator QMap<Key, T>::key_iterator::operator--(int)
1839 
1840     \overload
1841 
1842     The postfix -- operator (\c{i--}) makes the preceding item
1843     current and returns an iterator pointing to the previous
1844     item.
1845 */
1846 
1847 /*! \fn template <class Key, class T> const_iterator QMap<Key, T>::key_iterator::base() const
1848     Returns the underlying const_iterator this key_iterator is based on.
1849 */
1850 
1851 /*! \typedef QMap::const_key_value_iterator
1852     \inmodule QtCore
1853     \since 5.10
1854     \brief The QMap::const_key_value_iterator typedef provides an STL-style iterator for QMap and QMultiMap.
1855 
1856     QMap::const_key_value_iterator is essentially the same as QMap::const_iterator
1857     with the difference that operator*() returns a key/value pair instead of a
1858     value.
1859 
1860     \sa QKeyValueIterator
1861 */
1862 
1863 /*! \typedef QMap::key_value_iterator
1864     \inmodule QtCore
1865     \since 5.10
1866     \brief The QMap::key_value_iterator typedef provides an STL-style iterator for QMap and QMultiMap.
1867 
1868     QMap::key_value_iterator is essentially the same as QMap::iterator
1869     with the difference that operator*() returns a key/value pair instead of a
1870     value.
1871 
1872     \sa QKeyValueIterator
1873 */
1874 
1875 /*! \fn template <class Key, class T> QDataStream &operator<<(QDataStream &out, const QMap<Key, T> &map)
1876     \relates QMap
1877 
1878     Writes the map \a map to stream \a out.
1879 
1880     This function requires the key and value types to implement \c
1881     operator<<().
1882 
1883     \sa{Serializing Qt Data Types}{Format of the QDataStream operators}
1884 */
1885 
1886 /*! \fn template <class Key, class T> QDataStream &operator>>(QDataStream &in, QMap<Key, T> &map)
1887     \relates QMap
1888 
1889     Reads a map from stream \a in into \a map.
1890 
1891     This function requires the key and value types to implement \c
1892     operator>>().
1893 
1894     \sa{Serializing Qt Data Types}{Format of the QDataStream operators}
1895 */
1896 
1897 /*! \class QMultiMap
1898     \inmodule QtCore
1899     \brief The QMultiMap class is a convenience QMap subclass that provides multi-valued maps.
1900 
1901     \ingroup tools
1902     \ingroup shared
1903 
1904     \reentrant
1905 
1906     QMultiMap\<Key, T\> is one of Qt's generic \l{container classes}.
1907     It inherits QMap and extends it with a few functions
1908     that make it able to store multi-valued maps. A multi-valued map
1909     is a map that allows multiple values with the same key; QMap
1910     doesn't allow that.
1911 
1912     Because QMultiMap inherits QMap, all of QMap's functionality also
1913     applies to QMultiMap. For example, you can use isEmpty() to test
1914     whether the map is empty, and you can traverse a QMultiMap using
1915     QMap's iterator classes (for example, QMapIterator). But in
1916     addition, it provides an insert() function that inserts but does
1917     not overwrite any previous value if the key already exists,
1918     and a replace() function that corresponds which does overwite
1919     an existing value if they key is already in the map.
1920     It also provides convenient operator+() and operator+=().
1921 
1922     Example:
1923     \snippet code/src_corelib_tools_qmap.cpp 25
1924 
1925     Unlike QMap, QMultiMap provides no operator[]. Use value() or
1926     replace() if you want to access the most recently inserted item
1927     with a certain key.
1928 
1929     If you want to retrieve all the values for a single key, you can
1930     use values(const Key &key), which returns a QList<T>:
1931 
1932     \snippet code/src_corelib_tools_qmap.cpp 26
1933 
1934     The items that share the same key are available from most
1935     recently to least recently inserted.
1936 
1937     If you prefer the STL-style iterators, you can call find() to get
1938     the iterator for the first item with a key and iterate from
1939     there:
1940 
1941     \snippet code/src_corelib_tools_qmap.cpp 27
1942 
1943     QMultiMap's key and value data types must be \l{assignable data
1944     types}. This covers most data types you are likely to encounter,
1945     but the compiler won't let you, for example, store a QWidget as a
1946     value; instead, store a QWidget *. In addition, QMultiMap's key type
1947     must provide operator<(). See the QMap documentation for details.
1948 
1949     \sa QMap, QMapIterator, QMutableMapIterator, QMultiHash
1950 */
1951 
1952 /*! \fn template <class Key, class T> QMultiMap<Key, T>::QMultiMap()
1953 
1954     Constructs an empty map.
1955 */
1956 
1957 /*! \fn template <class Key, class T> QMultiMap<Key, T>::QMultiMap(std::initializer_list<std::pair<Key,T> > list)
1958     \since 5.1
1959 
1960     Constructs a multi-map with a copy of each of the elements in the
1961     initializer list \a list.
1962 
1963     This function is only available if the program is being
1964     compiled in C++11 mode.
1965 */
1966 
1967 /*! \fn template <class Key, class T> QMultiMap<Key, T>::QMultiMap(const QMap<Key, T> &other)
1968 
1969     Constructs a copy of \a other (which can be a QMap or a
1970     QMultiMap).
1971 
1972     \sa operator=()
1973 */
1974 
1975 /*! \fn template <class Key, class T> QMultiMap<Key, T>::iterator QMultiMap<Key, T>::replace(const Key &key, const T &value)
1976 
1977     Inserts a new item with the key \a key and a value of \a value.
1978 
1979     If there is already an item with the key \a key, that item's value
1980     is replaced with \a value.
1981 
1982     If there are multiple items with the key \a key, the most
1983     recently inserted item's value is replaced with \a value.
1984 
1985     \sa insert()
1986 */
1987 
1988 /*! \fn template <class Key, class T> QMultiMap<Key, T>::iterator QMultiMap<Key, T>::insert(const Key &key, const T &value)
1989 
1990     Inserts a new item with the key \a key and a value of \a value.
1991 
1992     If there is already an item with the same key in the map, this
1993     function will simply create a new one. (This behavior is
1994     different from replace(), which overwrites the value of an
1995     existing item.)
1996 
1997     \sa replace()
1998 */
1999 
2000 /*! \fn [qmultimap-insert-pos] template <class Key, class T> typename QMultiMap<Key, T>::iterator QMultiMap<Key, T>::insert(typename QMultiMap<Key, T>::const_iterator pos, const Key &key, const T &value)
2001 
2002     \since 5.1
2003     Inserts a new item with the key \a key and value \a value and with hint \a pos
2004     suggesting where to do the insert.
2005 
2006     If constBegin() is used as hint it indicates that the \a key is less than any key in the map
2007     while constEnd() suggests that the \a key is larger than any key in the map.
2008     Otherwise the hint should meet the condition (\a pos - 1).key() < \a key <= pos.key().
2009     If the hint \a pos is wrong it is ignored and a regular insert is done.
2010 
2011     If there is already an item with the same key in the map, this function will simply create a new one.
2012 
2013     \b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
2014     crash but there is also a risk that it will silently corrupt both the map and the \a pos map.
2015 */
2016 
2017 /*! \fn template <class Key, class T> QMultiMap &QMultiMap<Key, T>::operator+=(const QMultiMap &other)
2018 
2019     Inserts all the items in the \a other map into this map and
2020     returns a reference to this map.
2021 
2022     \sa insert(), operator+()
2023 */
2024 
2025 /*! \fn template <class Key, class T> QMultiMap QMultiMap<Key, T>::operator+(const QMultiMap &other) const
2026 
2027     Returns a map that contains all the items in this map in
2028     addition to all the items in \a other. If a key is common to both
2029     maps, the resulting map will contain the key multiple times.
2030 
2031     \sa operator+=()
2032 */
2033 
2034 /*!
2035     \fn template <class Key, class T> bool QMultiMap<Key, T>::contains(const Key &key, const T &value) const
2036     \since 4.3
2037 
2038     Returns \c true if the map contains an item with key \a key and
2039     value \a value; otherwise returns \c false.
2040 
2041     \sa QMap::contains()
2042 */
2043 
2044 /*!
2045     \fn template <class Key, class T> int QMultiMap<Key, T>::remove(const Key &key, const T &value)
2046     \since 4.3
2047 
2048     Removes all the items that have the key \a key and the value \a
2049     value from the map. Returns the number of items removed.
2050 
2051     \sa QMap::remove()
2052 */
2053 
2054 /*!
2055     \fn template <class Key, class T> int QMultiMap<Key, T>::count(const Key &key, const T &value) const
2056     \since 4.3
2057 
2058     Returns the number of items with key \a key and value \a value.
2059 
2060     \sa QMap::count()
2061 */
2062 
2063 /*!
2064     \fn template <class Key, class T> typename QMap<Key, T>::iterator QMultiMap<Key, T>::find(const Key &key, const T &value)
2065     \since 4.3
2066 
2067     Returns an iterator pointing to the item with key \a key and
2068     value \a value in the map.
2069 
2070     If the map contains no such item, the function returns end().
2071 
2072     If the map contains multiple items with key \a key, this
2073     function returns an iterator that points to the most recently
2074     inserted value.
2075 
2076     \sa QMap::find()
2077 */
2078 
2079 /*!
2080     \fn template <class Key, class T> typename QMap<Key, T>::const_iterator QMultiMap<Key, T>::find(const Key &key, const T &value) const
2081     \since 4.3
2082     \overload
2083 
2084     Returns a const iterator pointing to the item with the given \a key and
2085     \a value in the map.
2086 
2087     If the map contains no such item, the function returns end().
2088 
2089     If the map contains multiple items with the specified \a key, this
2090     function returns a const iterator that points to the most recently
2091     inserted value.
2092 
2093     \sa QMap::find()
2094 */
2095 
2096 /*!
2097     \fn template <class Key, class T> typename QMap<Key, T>::const_iterator QMultiMap<Key, T>::constFind(const Key &key, const T &value) const
2098     \since 4.3
2099 
2100     Returns an iterator pointing to the item with key \a key and the
2101     value \a value in the map.
2102 
2103     If the map contains no such item, the function returns
2104     constEnd().
2105 
2106     \sa QMap::constFind()
2107 */
2108 
2109 /*! \fn template <class Key, class T> QList<T> QMultiMap<Key, T>::values(const Key &key) const
2110 
2111     Returns a list containing all the values associated with key
2112     \a key, from the most recently inserted to the least recently
2113     inserted one.
2114 */
2115 
2116 /*! \fn template <class Key, class T> QList<Key> QMultiMap<Key, T>::uniqueKeys() const
2117     \since 4.2
2118 
2119     Returns a list containing all the keys in the map in ascending
2120     order. Keys that occur multiple times in the map occur only
2121     once in the returned list.
2122 */
2123 
2124 /*!
2125     \fn [qmultimap-unite] template <class Key, class T> QMultiMap<Key, T> &QMultiMap<Key, T>::unite(const QMultiMap<Key, T> &other)
2126 
2127     Inserts all the items in the \a other map into this map. If a
2128     key is common to both maps, the resulting map will contain the
2129     key multiple times.
2130 */
2131 
2132 QT_END_NAMESPACE
2133