263 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
265 friend class QMultiMap<
Key,
T>;
285 insert(p.first, p.second);
288 explicit QMap(
const std::map<Key, T> &other)
293 explicit QMap(std::map<Key, T> &&other)
311 return std::move(d->m);
319 template <
typename AKey = Key,
typename AT = T,
320 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>
328 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
330 QT_DECLARE_EQUALITY_OPERATORS_HELPER(
QMap,
QMap, ,
noexcept(
false),
331 template <
typename AKey = Key,
typename AT = T,
332 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>)
443#ifdef __cpp_lib_node_extract
544 friend class QMap<Key, T>;
545 friend class const_iterator;
547 typename Map::iterator i;
548 explicit iterator(
typename Map::iterator it) : i(it) {}
550 using iterator_category =
std::bidirectional_iterator_tag;
551 using difference_type = qptrdiff;
552 using value_type = T;
554 using reference = T &;
556 iterator() =
default;
558 const Key &key()
const {
return i->first; }
559 T &value()
const {
return i->second; }
560 T &operator*()
const {
return i->second; }
561 T *operator->()
const {
return &i->second; }
562 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
563 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
565 iterator &operator++()
570 iterator operator++(
int)
576 iterator &operator--()
581 iterator operator--(
int)
588#if QT_DEPRECATED_SINCE(6
, 0
)
589 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
591 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
593 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
595 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
597 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
598 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
600 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
601 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
603 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
605 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
607 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
609 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
615 friend class QMap<Key, T>;
616 typename Map::const_iterator i;
617 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
620 using iterator_category =
std::bidirectional_iterator_tag;
621 using difference_type = qptrdiff;
622 using value_type = T;
623 using pointer =
const T *;
624 using reference =
const T &;
626 const_iterator() =
default;
627 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
629 const Key &key()
const {
return i->first; }
630 const T &value()
const {
return i->second; }
631 const T &operator*()
const {
return i->second; }
632 const T *operator->()
const {
return &i->second; }
633 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
634 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
636 const_iterator &operator++()
641 const_iterator operator++(
int)
643 const_iterator r = *
this;
647 const_iterator &operator--()
652 const_iterator operator--(
int)
654 const_iterator r = *
this;
659#if QT_DEPRECATED_SINCE(6
, 0
)
660 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
662 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
664 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
666 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
668 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
669 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
671 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
672 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
674 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
676 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
678 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
680 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
689 typedef typename const_iterator::iterator_category iterator_category;
690 typedef typename const_iterator::difference_type difference_type;
691 typedef Key value_type;
692 typedef const Key *pointer;
693 typedef const Key &reference;
695 key_iterator() =
default;
696 explicit key_iterator(const_iterator o) : i(o) { }
698 const Key &operator*()
const {
return i.key(); }
699 const Key *operator->()
const {
return &i.key(); }
700 bool operator==(key_iterator o)
const {
return i == o.i; }
701 bool operator!=(key_iterator o)
const {
return i != o.i; }
703 inline key_iterator &operator++() { ++i;
return *
this; }
704 inline key_iterator operator++(
int) {
return key_iterator(i++);}
705 inline key_iterator &operator--() { --i;
return *
this; }
706 inline key_iterator operator--(
int) {
return key_iterator(i--); }
707 const_iterator base()
const {
return i; }
710 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
711 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
714 iterator begin() { detach();
return iterator(d->m.begin()); }
715 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
716 const_iterator constBegin()
const {
return begin(); }
717 const_iterator cbegin()
const {
return begin(); }
718 iterator end() { detach();
return iterator(d->m.end()); }
719 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
720 const_iterator constEnd()
const {
return end(); }
721 const_iterator cend()
const {
return end(); }
722 key_iterator keyBegin()
const {
return key_iterator(begin()); }
723 key_iterator keyEnd()
const {
return key_iterator(end()); }
724 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
725 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
726 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
727 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
728 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
729 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
730 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMap &>(*
this); }
731 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMap &>(*
this); }
732 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
733 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
735 iterator erase(const_iterator it)
737 return erase(it,
std::next(it));
740 iterator erase(const_iterator afirst, const_iterator alast)
746 return iterator(d->m.erase(afirst.i, alast.i));
748 auto result = d->erase(afirst.i, alast.i);
749 d.reset(result.data);
750 return iterator(result.it);
754 typedef iterator Iterator;
755 typedef const_iterator ConstIterator;
757 iterator find(
const Key &key)
759 const auto hold = referenceHoldingDetach();
760 return iterator(d->m.find(key));
763 const_iterator find(
const Key &key)
const
766 return const_iterator();
767 return const_iterator(d->m.find(key));
770 const_iterator constFind(
const Key &key)
const
775 iterator lowerBound(
const Key &key)
777 const auto hold = referenceHoldingDetach();
778 return iterator(d->m.lower_bound(key));
781 const_iterator lowerBound(
const Key &key)
const
784 return const_iterator();
785 return const_iterator(d->m.lower_bound(key));
788 iterator upperBound(
const Key &key)
790 const auto hold = referenceHoldingDetach();
791 return iterator(d->m.upper_bound(key));
794 const_iterator upperBound(
const Key &key)
const
797 return const_iterator();
798 return const_iterator(d->m.upper_bound(key));
801 iterator insert(
const Key &key,
const T &value)
803 const auto hold = referenceHoldingDetachExcept(key);
804 return iterator(d->m.insert_or_assign(key, value).first);
807 iterator insert(const_iterator pos,
const Key &key,
const T &value)
811 return iterator(d->m.emplace(key, value).first);
812 }
else if (d.isShared()) {
813 auto posDistance =
std::distance(d->m.cbegin(), pos.i);
814 const auto hold = referenceHoldingDetachExcept(key);
815 auto dpos =
std::next(d->m.cbegin(), posDistance);
816 return iterator(d->m.insert_or_assign(dpos, key, value));
818 return iterator(d->m.insert_or_assign(pos.i, key, value));
821 void insert(
const QMap<Key, T> &map)
832 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newD(
new MapData);
833 const auto commit = qScopeGuard([&] { newD.swap(d); });
834 newD->fillWithMergeOf(d->m, map.d->m);
838#ifdef __cpp_lib_node_extract
840 auto copy = map.d->m;
842 d->m = std::move(copy);
844 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newD(
new MapData);
845 const auto commit = qScopeGuard([&] { newD.swap(d); });
846 newD->fillWithMergeOf(d->m, map.d->m);
851 void insert(
QMap<Key, T> &&map)
853 if (map.isEmpty() || map.d.isShared()) {
860 const auto commit = qScopeGuard([&] { map
.swap(*
this); });
865 map.d->insertMap(d->m);
869#ifdef __cpp_lib_node_extract
870 map.d->m.merge(
std::move(d->m));
873 map.d->insertMap(d->m);
879 inline bool empty()
const
884 std::pair<iterator, iterator> equal_range(
const Key &akey)
886 const auto hold = referenceHoldingDetach();
887 auto result = d->m.equal_range(akey);
888 return {iterator(result.first), iterator(result.second)};
891 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
895 auto result = d->m.equal_range(akey);
896 return {const_iterator(result.first), const_iterator(result.second)};
903# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
913 qHash(
const M &key, size_t seed = 0)
919 return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
920 QtPrivate::QHashCombine{seed});
942 using Map = std::multimap<Key, T>;
943 using MapData = QMapData<Map>;
944 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
947 using key_type = Key;
948 using mapped_type = T;
949 using difference_type = qptrdiff;
950 using size_type = qsizetype;
952 QMultiMap() =
default;
956 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
959 insert(p.first, p.second);
962 void swap(QMultiMap<Key, T> &other)
noexcept
967 explicit QMultiMap(
const QMap<Key, T> &other)
968 : d(other.isEmpty() ?
nullptr :
new MapData)
972 d->m.insert(other.d->m.begin(),
977 explicit QMultiMap(QMap<Key, T> &&other)
978 : d(other.isEmpty() ?
nullptr :
new MapData)
982 if (other.d.isShared()) {
983 d->m.insert(other.d->m.begin(),
986#ifdef __cpp_lib_node_extract
987 d->m.merge(std::move(other.d->m));
989 d->m.insert(std::make_move_iterator(other.d->m.begin()),
990 std::make_move_iterator(other.d->m.end()));
996 explicit QMultiMap(
const std::multimap<Key, T> &other)
997 : d(other.empty() ?
nullptr :
new MapData(other))
1001 explicit QMultiMap(std::multimap<Key, T> &&other)
1002 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
1007 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
1008 std::multimap<Key, T> toStdMap()
const
1010 return toStdMultiMap();
1013 std::multimap<Key, T> toStdMultiMap()
const &
1020 std::multimap<Key, T> toStdMultiMap() &&
1026 return std::move(d->m);
1034 template <
typename AKey = Key,
typename AT = T,
1035 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
1036 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
1043 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
1045 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
1046 template <
typename AKey = Key,
typename AT = T,
1047 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
1051 friend bool operator==(
const QMultiMap &lhs,
const QMultiMap &rhs);
1052 friend bool operator!=(
const QMultiMap &lhs,
const QMultiMap &rhs);
1055 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
1058 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
1065 d.reset(
new MapData);
1070 [[nodiscard]] QMultiMap referenceHoldingDetach()
1073 d.reset(
new MapData);
1074 }
else if (d.isShared()) {
1083 [[nodiscard]] QMultiMap referenceHoldingDetachExceptFor(
const typename Map::iterator &skipit)
1085 Q_ASSERT(d.isShared());
1087 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1088 newData->copyExceptFor(d->m, skipit);
1093 bool isDetached()
const noexcept
1095 return d ? !d.isShared() :
false;
1098 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
1100 return d == other.d;
1114 size_type remove(
const Key &key)
1120 return size_type(d->m.erase(key));
1122 MapData *newData =
new MapData;
1123 size_type result = newData->copyIfNotEquivalentTo(d->m, key).count;
1130 size_type remove(
const Key &key,
const T &value)
1135 size_type result = 0;
1136 const auto &keyCompare = d->m.key_comp();
1139 QtPrivate::QExplicitlySharedDataPointerV2<MapData> newData(
new MapData);
1140 const auto keep = [&newData](
auto it) { newData->m.insert(newData->m.cend(), *it); };
1142 auto it = d->m.cbegin();
1143 const auto end = d->m.cend();
1144 for (; it != end && keyCompare(it->first, key); ++it)
1147 for (; it != end && !keyCompare(key, it->first); ++it) {
1148 if (!(it->second == value))
1153 for (; it != end; ++it)
1162 const Key keyCopy = key;
1163 const T valueCopy = value;
1165 auto i = d->m.find(keyCopy);
1166 const auto e = d->m.end();
1168 while (i != e && !keyCompare(keyCopy, i->first)) {
1169 if (i->second == valueCopy) {
1180 template <
typename Predicate>
1181 size_type removeIf(Predicate pred)
1183 return QtPrivate::associative_erase_if(*
this, pred);
1186 T take(
const Key &key)
1192 auto i = d->m.find(key);
1193 const auto hold = referenceHoldingDetachExceptFor(i);
1197#ifdef __cpp_lib_node_extract
1198 if (
const auto node = d->m.extract(key))
1199 return std::move(node.mapped());
1201 auto i = d->m.find(key);
1202 if (i != d->m.end()) {
1204 T result(std::move(i->second));
1212 bool contains(
const Key &key)
const
1216 auto i = d->m.find(key);
1217 return i != d->m.end();
1220 bool contains(
const Key &key,
const T &value)
const
1222 return find(key, value) != end();
1225 Key key(
const T &value,
const Key &defaultKey = Key())
const
1230 return d->key(value, defaultKey);
1233 T value(
const Key &key,
const T &defaultValue = T())
const
1236 return defaultValue;
1237 const auto i = d->m.find(key);
1238 if (i != d->m.cend())
1240 return defaultValue;
1243 QList<Key> keys()
const
1250 QList<Key> keys(
const T &value)
const
1254 return d->keys(value);
1257 QList<Key> uniqueKeys()
const
1263 result.reserve(size());
1265 std::unique_copy(keyBegin(), keyEnd(),
1266 std::back_inserter(result));
1268 result.shrink_to_fit();
1272 QList<T> values()
const
1279 QList<T> values(
const Key &key)
const
1282 const auto range = equal_range(key);
1283 result.reserve(std::distance(range.first, range.second));
1284 std::copy(range.first, range.second, std::back_inserter(result));
1288 size_type count(
const Key &key)
const
1292 return d->count(key);
1295 size_type count(
const Key &key,
const T &value)
const
1301 auto range = d->m.equal_range(key);
1303 return size_type(std::count_if(range.first,
1305 MapData::valueIsEqualTo(value)));
1308 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1309 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1311 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1312 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1313 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1314 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1316 class const_iterator;
1320 friend class QMultiMap<Key, T>;
1321 friend class const_iterator;
1323 typename Map::iterator i;
1324 explicit iterator(
typename Map::iterator it) : i(it) {}
1326 using iterator_category = std::bidirectional_iterator_tag;
1327 using difference_type = qptrdiff;
1328 using value_type = T;
1329 using pointer = T *;
1330 using reference = T &;
1332 iterator() =
default;
1334 const Key &key()
const {
return i->first; }
1335 T &value()
const {
return i->second; }
1336 T &operator*()
const {
return i->second; }
1337 T *operator->()
const {
return &i->second; }
1338 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1339 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1341 iterator &operator++()
1346 iterator operator++(
int)
1352 iterator &operator--()
1357 iterator operator--(
int)
1364#if QT_DEPRECATED_SINCE(6
, 0
)
1365 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1367 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1369 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1371 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1373 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1374 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1376 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1377 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1379 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1381 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1383 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1385 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1389 class const_iterator
1391 friend class QMultiMap<Key, T>;
1392 typename Map::const_iterator i;
1393 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1396 using iterator_category = std::bidirectional_iterator_tag;
1397 using difference_type = qptrdiff;
1398 using value_type = T;
1399 using pointer =
const T *;
1400 using reference =
const T &;
1402 const_iterator() =
default;
1403 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1405 const Key &key()
const {
return i->first; }
1406 const T &value()
const {
return i->second; }
1407 const T &operator*()
const {
return i->second; }
1408 const T *operator->()
const {
return &i->second; }
1409 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1410 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1412 const_iterator &operator++()
1417 const_iterator operator++(
int)
1419 const_iterator r = *
this;
1423 const_iterator &operator--()
1428 const_iterator operator--(
int)
1430 const_iterator r = *
this;
1435#if QT_DEPRECATED_SINCE(6
, 0
)
1436 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1438 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1440 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1442 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1444 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1445 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1447 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1448 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1450 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1452 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1454 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1456 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1465 typedef typename const_iterator::iterator_category iterator_category;
1466 typedef typename const_iterator::difference_type difference_type;
1467 typedef Key value_type;
1468 typedef const Key *pointer;
1469 typedef const Key &reference;
1471 key_iterator() =
default;
1472 explicit key_iterator(const_iterator o) : i(o) { }
1474 const Key &operator*()
const {
return i.key(); }
1475 const Key *operator->()
const {
return &i.key(); }
1476 bool operator==(key_iterator o)
const {
return i == o.i; }
1477 bool operator!=(key_iterator o)
const {
return i != o.i; }
1479 inline key_iterator &operator++() { ++i;
return *
this; }
1480 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1481 inline key_iterator &operator--() { --i;
return *
this; }
1482 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1483 const_iterator base()
const {
return i; }
1486 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1487 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1490 iterator begin() { detach();
return iterator(d->m.begin()); }
1491 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1492 const_iterator constBegin()
const {
return begin(); }
1493 const_iterator cbegin()
const {
return begin(); }
1494 iterator end() { detach();
return iterator(d->m.end()); }
1495 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1496 const_iterator constEnd()
const {
return end(); }
1497 const_iterator cend()
const {
return end(); }
1498 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1499 key_iterator keyEnd()
const {
return key_iterator(end()); }
1500 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1501 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1502 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1503 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1504 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1505 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1506 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMultiMap &>(*
this); }
1507 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMultiMap &>(*
this); }
1508 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1509 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1511 iterator erase(const_iterator it)
1513 return erase(it, std::next(it));
1516 iterator erase(const_iterator afirst, const_iterator alast)
1522 return iterator(d->m.erase(afirst.i, alast.i));
1524 auto result = d->erase(afirst.i, alast.i);
1525 d.reset(result.data);
1526 return iterator(result.it);
1530 typedef iterator Iterator;
1531 typedef const_iterator ConstIterator;
1533 size_type count()
const
1538 iterator find(
const Key &key)
1540 const auto hold = referenceHoldingDetach();
1541 return iterator(d->m.find(key));
1544 const_iterator find(
const Key &key)
const
1547 return const_iterator();
1548 return const_iterator(d->m.find(key));
1551 const_iterator constFind(
const Key &key)
const
1556 iterator find(
const Key &key,
const T &value)
1558 const auto hold = referenceHoldingDetach();
1560 auto range = d->m.equal_range(key);
1561 auto i = std::find_if(range.first, range.second,
1562 MapData::valueIsEqualTo(value));
1564 if (i != range.second)
1566 return iterator(d->m.end());
1569 const_iterator find(
const Key &key,
const T &value)
const
1572 return const_iterator();
1574 auto range = d->m.equal_range(key);
1575 auto i = std::find_if(range.first, range.second,
1576 MapData::valueIsEqualTo(value));
1578 if (i != range.second)
1579 return const_iterator(i);
1580 return const_iterator(d->m.end());
1583 const_iterator constFind(
const Key &key,
const T &value)
const
1585 return find(key, value);
1588 iterator lowerBound(
const Key &key)
1590 const auto hold = referenceHoldingDetach();
1591 return iterator(d->m.lower_bound(key));
1594 const_iterator lowerBound(
const Key &key)
const
1597 return const_iterator();
1598 return const_iterator(d->m.lower_bound(key));
1601 iterator upperBound(
const Key &key)
1603 const auto hold = referenceHoldingDetach();
1604 return iterator(d->m.upper_bound(key));
1607 const_iterator upperBound(
const Key &key)
const
1610 return const_iterator();
1611 return const_iterator(d->m.upper_bound(key));
1614 iterator insert(
const Key &key,
const T &value)
1616 const auto hold = referenceHoldingDetach();
1619 auto i = d->m.lower_bound(key);
1620 return iterator(d->m.insert(i, {key, value}));
1623 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1626 d.reset(
new MapData);
1627 return iterator(d->m.insert({ key, value }));
1628 }
else if (d.isShared()) {
1629 auto posDistance = std::distance(d->m.cbegin(), pos.i);
1630 auto hold = referenceHoldingDetach();
1631 auto dpos = std::next(d->m.cbegin(), posDistance);
1632 return iterator(d->m.insert(dpos, {key, value}));
1635 return iterator(d->m.insert(pos.i, {key, value}));
1638#if QT_DEPRECATED_SINCE(6
, 0
)
1639 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1640 iterator insertMulti(
const Key &key,
const T &value)
1642 return insert(key, value);
1644 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1645 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1647 return insert(pos, key, value);
1650 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1651 void insert(
const QMultiMap<Key, T> &map)
1656 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1657 void insert(QMultiMap<Key, T> &&map)
1659 unite(std::move(map));
1663 iterator replace(
const Key &key,
const T &value)
1666 d.reset(
new MapData);
1667 return iterator(d->m.insert({ key, value }));
1669 auto i = d->m.find(key);
1671 const auto hold = referenceHoldingDetachExceptFor(i);
1672 return iterator(d->m.insert({ key, value }));
1677 if (i != d->m.end())
1680 i = d->m.insert({key, value});
1687 inline bool empty()
const {
return isEmpty(); }
1689 std::pair<iterator, iterator> equal_range(
const Key &akey)
1691 const auto hold = referenceHoldingDetach();
1692 auto result = d->m.equal_range(akey);
1693 return {iterator(result.first), iterator(result.second)};
1696 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1700 auto result = d->m.equal_range(akey);
1701 return {const_iterator(result.first), const_iterator(result.second)};
1704 QMultiMap &unite(
const QMultiMap &other)
1706 if (other.isEmpty())
1711 auto copy = other.d->m;
1712#ifdef __cpp_lib_node_extract
1713 copy.merge(std::move(d->m));
1715 copy.insert(std::make_move_iterator(d->m.begin()),
1716 std::make_move_iterator(d->m.end()));
1718 d->m = std::move(copy);
1722 QMultiMap &unite(QMultiMap<Key, T> &&other)
1724 if (!other.d || other.d->m.empty())
1727 if (other.d.isShared()) {
1735#ifdef __cpp_lib_node_extract
1736 other.d->m.merge(std::move(d->m));
1738 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1739 std::make_move_iterator(d->m.end()));
1741 *
this = std::move(other);