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, .size: 0, .header: { .p: 0, .left: nullptr, .right: nullptr }, .mostLeftNode: nullptr }; |
52 | |
53 | 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 | |
71 | 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 | |
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 | |
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 | |
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: 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: x->parent()->parent()); |
164 | } |
165 | } |
166 | } |
167 | root->setColor(QMapNodeBase::Black); |
168 | } |
169 | |
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: 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(x: 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: 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: 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(x: 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: x_parent); |
286 | break; |
287 | } |
288 | } |
289 | } |
290 | if (x) |
291 | x->setColor(QMapNodeBase::Black); |
292 | } |
293 | free(ptr: y); |
294 | --size; |
295 | } |
296 | |
297 | void QMapDataBase::recalcMostLeftNode() |
298 | { |
299 | mostLeftNode = &header; |
300 | while (mostLeftNode->left) |
301 | mostLeftNode = mostLeftNode->left; |
302 | } |
303 | |
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 | |
312 | static inline void *qMapAllocate(int alloc, int alignment) |
313 | { |
314 | return alignment > qMapAlignmentThreshold() |
315 | ? qMallocAligned(size: alloc, alignment) |
316 | : ::malloc(size: alloc); |
317 | } |
318 | |
319 | static inline void qMapDeallocate(QMapNodeBase *node, int alignment) |
320 | { |
321 | if (alignment > qMapAlignmentThreshold()) |
322 | qFreeAligned(ptr: node); |
323 | else |
324 | ::free(ptr: node); |
325 | } |
326 | |
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(s: node, c: 0, n: 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(x: node); |
345 | } |
346 | return node; |
347 | } |
348 | |
349 | void QMapDataBase::freeTree(QMapNodeBase *root, int alignment) |
350 | { |
351 | if (root->left) |
352 | freeTree(root: root->left, alignment); |
353 | if (root->right) |
354 | freeTree(root: root->right, alignment); |
355 | qMapDeallocate(node: root, alignment); |
356 | } |
357 | |
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 | |
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 | |