192 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
194 friend class QMultiMap<
Key,
T>;
214 insert(p.first, p.second);
217 explicit QMap(
const std::map<Key, T> &other)
222 explicit QMap(std::map<Key, T> &&other)
240 return std::move(d->m);
248 template <
typename AKey = Key,
typename AT = T,
249 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>
257 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
259 QT_DECLARE_EQUALITY_OPERATORS_HELPER(
QMap,
QMap, ,
noexcept(
false),
260 template <
typename AKey = Key,
typename AT = T,
261 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>)
335#ifdef __cpp_lib_node_extract
437 friend class QMap<Key, T>;
438 friend class const_iterator;
440 typename Map::iterator i;
441 explicit iterator(
typename Map::iterator it) : i(it) {}
443 using iterator_category =
std::bidirectional_iterator_tag;
444 using difference_type = qptrdiff;
445 using value_type = T;
447 using reference = T &;
449 iterator() =
default;
451 const Key &key()
const {
return i->first; }
452 T &value()
const {
return i->second; }
453 T &operator*()
const {
return i->second; }
454 T *operator->()
const {
return &i->second; }
455 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
456 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
458 iterator &operator++()
463 iterator operator++(
int)
469 iterator &operator--()
474 iterator operator--(
int)
481#if QT_DEPRECATED_SINCE(6
, 0
)
482 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
484 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
486 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
488 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
490 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
491 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
493 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
494 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
496 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
498 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
500 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
502 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
508 friend class QMap<Key, T>;
509 typename Map::const_iterator i;
510 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
513 using iterator_category =
std::bidirectional_iterator_tag;
514 using difference_type = qptrdiff;
515 using value_type = T;
516 using pointer =
const T *;
517 using reference =
const T &;
519 const_iterator() =
default;
520 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
522 const Key &key()
const {
return i->first; }
523 const T &value()
const {
return i->second; }
524 const T &operator*()
const {
return i->second; }
525 const T *operator->()
const {
return &i->second; }
526 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
527 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
529 const_iterator &operator++()
534 const_iterator operator++(
int)
536 const_iterator r = *
this;
540 const_iterator &operator--()
545 const_iterator operator--(
int)
547 const_iterator r = *
this;
552#if QT_DEPRECATED_SINCE(6
, 0
)
553 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
555 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
557 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
559 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
561 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
562 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
564 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
565 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
567 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
569 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
571 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
573 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
582 typedef typename const_iterator::iterator_category iterator_category;
583 typedef typename const_iterator::difference_type difference_type;
584 typedef Key value_type;
585 typedef const Key *pointer;
586 typedef const Key &reference;
588 key_iterator() =
default;
589 explicit key_iterator(const_iterator o) : i(o) { }
591 const Key &operator*()
const {
return i.key(); }
592 const Key *operator->()
const {
return &i.key(); }
593 bool operator==(key_iterator o)
const {
return i == o.i; }
594 bool operator!=(key_iterator o)
const {
return i != o.i; }
596 inline key_iterator &operator++() { ++i;
return *
this; }
597 inline key_iterator operator++(
int) {
return key_iterator(i++);}
598 inline key_iterator &operator--() { --i;
return *
this; }
599 inline key_iterator operator--(
int) {
return key_iterator(i--); }
600 const_iterator base()
const {
return i; }
603 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
604 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
607 iterator begin() { detach();
return iterator(d->m.begin()); }
608 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
609 const_iterator constBegin()
const {
return begin(); }
610 const_iterator cbegin()
const {
return begin(); }
611 iterator end() { detach();
return iterator(d->m.end()); }
612 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
613 const_iterator constEnd()
const {
return end(); }
614 const_iterator cend()
const {
return end(); }
615 key_iterator keyBegin()
const {
return key_iterator(begin()); }
616 key_iterator keyEnd()
const {
return key_iterator(end()); }
617 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
618 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
619 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
620 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
621 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
622 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
623 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMap &>(*
this); }
624 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMap &>(*
this); }
625 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
626 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
628 iterator erase(const_iterator it)
630 return erase(it,
std::next(it));
633 iterator erase(const_iterator afirst, const_iterator alast)
639 return iterator(d->m.erase(afirst.i, alast.i));
641 auto result = d->erase(afirst.i, alast.i);
642 d.reset(result.data);
643 return iterator(result.it);
647 typedef iterator Iterator;
648 typedef const_iterator ConstIterator;
650 iterator find(
const Key &key)
652 const auto copy = d.isShared() ? *
this : QMap();
654 return iterator(d->m.find(key));
657 const_iterator find(
const Key &key)
const
660 return const_iterator();
661 return const_iterator(d->m.find(key));
664 const_iterator constFind(
const Key &key)
const
669 iterator lowerBound(
const Key &key)
671 const auto copy = d.isShared() ? *
this : QMap();
673 return iterator(d->m.lower_bound(key));
676 const_iterator lowerBound(
const Key &key)
const
679 return const_iterator();
680 return const_iterator(d->m.lower_bound(key));
683 iterator upperBound(
const Key &key)
685 const auto copy = d.isShared() ? *
this : QMap();
687 return iterator(d->m.upper_bound(key));
690 const_iterator upperBound(
const Key &key)
const
693 return const_iterator();
694 return const_iterator(d->m.upper_bound(key));
697 iterator insert(
const Key &key,
const T &value)
699 const auto copy = d.isShared() ? *
this : QMap();
702 return iterator(d->m.insert_or_assign(key, value).first);
705 iterator insert(const_iterator pos,
const Key &key,
const T &value)
708 typename Map::const_iterator dpos;
709 const auto copy = d.isShared() ? *
this : QMap();
710 if (!d || d.isShared()) {
711 auto posDistance = d ? std::distance(d->m.cbegin(), pos.i) : 0;
713 dpos = std::next(d->m.cbegin(), posDistance);
717 return iterator(d->m.insert_or_assign(dpos, key, value));
720 void insert(
const QMap<Key, T> &map)
728#ifdef __cpp_lib_node_extract
729 auto copy = map.d->m;
730 copy.merge(std::move(d->m));
731 d->m = std::move(copy);
735 auto insertionHint = d->m.end();
736 auto mapIt = map.d->m.crbegin();
737 auto end = map.d->m.crend();
738 for (; mapIt != end; ++mapIt)
739 insertionHint = d->m.insert_or_assign(insertionHint, mapIt->first, mapIt->second);
743 void insert(
QMap<Key, T> &&map)
745 if (!map.d || map.d->m.empty())
748 if (map.d.isShared()) {
756#ifdef __cpp_lib_node_extract
757 map.d->m.merge(std::move(d->m));
758 *
this =
std::move(map);
761 auto insertionHint = d->m.end();
762 auto mapIt = map.d->m.crbegin();
763 auto end = map.d->m.crend();
764 for (; mapIt != end; ++mapIt)
765 insertionHint = d->m.insert_or_assign(insertionHint, std::move(mapIt->first), std::move(mapIt->second));
771 inline bool empty()
const
776 std::pair<iterator, iterator> equal_range(
const Key &akey)
778 const auto copy = d.isShared() ? *
this : QMap();
780 auto result = d->m.equal_range(akey);
781 return {iterator(result.first), iterator(result.second)};
784 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
788 auto result = d->m.equal_range(akey);
789 return {const_iterator(result.first), const_iterator(result.second)};
796# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
806 qHash(
const M &key, size_t seed = 0)
812 return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
813 QtPrivate::QHashCombine{seed});
835 using Map = std::multimap<Key, T>;
836 using MapData = QMapData<Map>;
837 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
840 using key_type = Key;
841 using mapped_type = T;
842 using difference_type = qptrdiff;
843 using size_type = qsizetype;
845 QMultiMap() =
default;
849 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
852 insert(p.first, p.second);
855 void swap(QMultiMap<Key, T> &other)
noexcept
860 explicit QMultiMap(
const QMap<Key, T> &other)
861 : d(other.isEmpty() ?
nullptr :
new MapData)
865 d->m.insert(other.d->m.begin(),
870 explicit QMultiMap(QMap<Key, T> &&other)
871 : d(other.isEmpty() ?
nullptr :
new MapData)
875 if (other.d.isShared()) {
876 d->m.insert(other.d->m.begin(),
879#ifdef __cpp_lib_node_extract
880 d->m.merge(std::move(other.d->m));
882 d->m.insert(std::make_move_iterator(other.d->m.begin()),
883 std::make_move_iterator(other.d->m.end()));
889 explicit QMultiMap(
const std::multimap<Key, T> &other)
890 : d(other.empty() ?
nullptr :
new MapData(other))
894 explicit QMultiMap(std::multimap<Key, T> &&other)
895 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
900 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
901 std::multimap<Key, T> toStdMap()
const
903 return toStdMultiMap();
906 std::multimap<Key, T> toStdMultiMap()
const &
913 std::multimap<Key, T> toStdMultiMap() &&
919 return std::move(d->m);
927 template <
typename AKey = Key,
typename AT = T,
928 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
929 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
936 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
938 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
939 template <
typename AKey = Key,
typename AT = T,
940 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
944 friend bool operator==(
const QMultiMap &lhs,
const QMultiMap &rhs);
945 friend bool operator!=(
const QMultiMap &lhs,
const QMultiMap &rhs);
948 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
951 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
958 d.reset(
new MapData);
961 bool isDetached()
const noexcept
963 return d ? !d.isShared() :
false;
966 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
982 size_type remove(
const Key &key)
988 return size_type(d->m.erase(key));
990 MapData *newData =
new MapData;
991 size_type result = newData->copyIfNotEquivalentTo(d->m, key);
998 size_type remove(
const Key &key,
const T &value)
1006 const Key keyCopy = key;
1007 const T valueCopy = value;
1012 size_type result = 0;
1013 const auto &keyCompare = d->m.key_comp();
1015 auto i = d->m.find(keyCopy);
1016 const auto e = d->m.end();
1018 while (i != e && !keyCompare(keyCopy, i->first)) {
1019 if (i->second == valueCopy) {
1030 template <
typename Predicate>
1031 size_type removeIf(Predicate pred)
1033 return QtPrivate::associative_erase_if(*
this, pred);
1036 T take(
const Key &key)
1041 const auto copy = d.isShared() ? *
this : QMultiMap();
1047#ifdef __cpp_lib_node_extract
1048 if (
const auto node = d->m.extract(key))
1049 return std::move(node.mapped());
1051 auto i = d->m.find(key);
1052 if (i != d->m.end()) {
1054 T result(std::move(i->second));
1062 bool contains(
const Key &key)
const
1066 auto i = d->m.find(key);
1067 return i != d->m.end();
1070 bool contains(
const Key &key,
const T &value)
const
1072 return find(key, value) != end();
1075 Key key(
const T &value,
const Key &defaultKey = Key())
const
1080 return d->key(value, defaultKey);
1083 T value(
const Key &key,
const T &defaultValue = T())
const
1086 return defaultValue;
1087 const auto i = d->m.find(key);
1088 if (i != d->m.cend())
1090 return defaultValue;
1093 QList<Key> keys()
const
1100 QList<Key> keys(
const T &value)
const
1104 return d->keys(value);
1107 QList<Key> uniqueKeys()
const
1113 result.reserve(size());
1115 std::unique_copy(keyBegin(), keyEnd(),
1116 std::back_inserter(result));
1118 result.shrink_to_fit();
1122 QList<T> values()
const
1129 QList<T> values(
const Key &key)
const
1132 const auto range = equal_range(key);
1133 result.reserve(std::distance(range.first, range.second));
1134 std::copy(range.first, range.second, std::back_inserter(result));
1138 size_type count(
const Key &key)
const
1142 return d->count(key);
1145 size_type count(
const Key &key,
const T &value)
const
1151 auto range = d->m.equal_range(key);
1153 return size_type(std::count_if(range.first,
1155 MapData::valueIsEqualTo(value)));
1158 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1159 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1161 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1162 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1163 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1164 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1166 class const_iterator;
1170 friend class QMultiMap<Key, T>;
1171 friend class const_iterator;
1173 typename Map::iterator i;
1174 explicit iterator(
typename Map::iterator it) : i(it) {}
1176 using iterator_category = std::bidirectional_iterator_tag;
1177 using difference_type = qptrdiff;
1178 using value_type = T;
1179 using pointer = T *;
1180 using reference = T &;
1182 iterator() =
default;
1184 const Key &key()
const {
return i->first; }
1185 T &value()
const {
return i->second; }
1186 T &operator*()
const {
return i->second; }
1187 T *operator->()
const {
return &i->second; }
1188 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1189 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1191 iterator &operator++()
1196 iterator operator++(
int)
1202 iterator &operator--()
1207 iterator operator--(
int)
1214#if QT_DEPRECATED_SINCE(6
, 0
)
1215 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1217 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1219 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1221 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1223 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1224 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1226 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1227 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1229 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1231 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1233 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1235 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1239 class const_iterator
1241 friend class QMultiMap<Key, T>;
1242 typename Map::const_iterator i;
1243 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1246 using iterator_category = std::bidirectional_iterator_tag;
1247 using difference_type = qptrdiff;
1248 using value_type = T;
1249 using pointer =
const T *;
1250 using reference =
const T &;
1252 const_iterator() =
default;
1253 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1255 const Key &key()
const {
return i->first; }
1256 const T &value()
const {
return i->second; }
1257 const T &operator*()
const {
return i->second; }
1258 const T *operator->()
const {
return &i->second; }
1259 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1260 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1262 const_iterator &operator++()
1267 const_iterator operator++(
int)
1269 const_iterator r = *
this;
1273 const_iterator &operator--()
1278 const_iterator operator--(
int)
1280 const_iterator r = *
this;
1285#if QT_DEPRECATED_SINCE(6
, 0
)
1286 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1288 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1290 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1292 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1294 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1295 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1297 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1298 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1300 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1302 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1304 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1306 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1315 typedef typename const_iterator::iterator_category iterator_category;
1316 typedef typename const_iterator::difference_type difference_type;
1317 typedef Key value_type;
1318 typedef const Key *pointer;
1319 typedef const Key &reference;
1321 key_iterator() =
default;
1322 explicit key_iterator(const_iterator o) : i(o) { }
1324 const Key &operator*()
const {
return i.key(); }
1325 const Key *operator->()
const {
return &i.key(); }
1326 bool operator==(key_iterator o)
const {
return i == o.i; }
1327 bool operator!=(key_iterator o)
const {
return i != o.i; }
1329 inline key_iterator &operator++() { ++i;
return *
this; }
1330 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1331 inline key_iterator &operator--() { --i;
return *
this; }
1332 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1333 const_iterator base()
const {
return i; }
1336 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1337 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1340 iterator begin() { detach();
return iterator(d->m.begin()); }
1341 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1342 const_iterator constBegin()
const {
return begin(); }
1343 const_iterator cbegin()
const {
return begin(); }
1344 iterator end() { detach();
return iterator(d->m.end()); }
1345 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1346 const_iterator constEnd()
const {
return end(); }
1347 const_iterator cend()
const {
return end(); }
1348 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1349 key_iterator keyEnd()
const {
return key_iterator(end()); }
1350 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1351 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1352 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1353 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1354 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1355 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1356 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMultiMap &>(*
this); }
1357 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMultiMap &>(*
this); }
1358 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1359 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1361 iterator erase(const_iterator it)
1363 return erase(it, std::next(it));
1366 iterator erase(const_iterator afirst, const_iterator alast)
1372 return iterator(d->m.erase(afirst.i, alast.i));
1374 auto result = d->erase(afirst.i, alast.i);
1375 d.reset(result.data);
1376 return iterator(result.it);
1380 typedef iterator Iterator;
1381 typedef const_iterator ConstIterator;
1383 size_type count()
const
1388 iterator find(
const Key &key)
1390 const auto copy = d.isShared() ? *
this : QMultiMap();
1392 return iterator(d->m.find(key));
1395 const_iterator find(
const Key &key)
const
1398 return const_iterator();
1399 return const_iterator(d->m.find(key));
1402 const_iterator constFind(
const Key &key)
const
1407 iterator find(
const Key &key,
const T &value)
1409 const auto copy = d.isShared() ? *
this : QMultiMap();
1413 auto range = d->m.equal_range(key);
1414 auto i = std::find_if(range.first, range.second,
1415 MapData::valueIsEqualTo(value));
1417 if (i != range.second)
1419 return iterator(d->m.end());
1422 const_iterator find(
const Key &key,
const T &value)
const
1425 return const_iterator();
1427 auto range = d->m.equal_range(key);
1428 auto i = std::find_if(range.first, range.second,
1429 MapData::valueIsEqualTo(value));
1431 if (i != range.second)
1432 return const_iterator(i);
1433 return const_iterator(d->m.end());
1436 const_iterator constFind(
const Key &key,
const T &value)
const
1438 return find(key, value);
1441 iterator lowerBound(
const Key &key)
1443 const auto copy = d.isShared() ? *
this : QMultiMap();
1445 return iterator(d->m.lower_bound(key));
1448 const_iterator lowerBound(
const Key &key)
const
1451 return const_iterator();
1452 return const_iterator(d->m.lower_bound(key));
1455 iterator upperBound(
const Key &key)
1457 const auto copy = d.isShared() ? *
this : QMultiMap();
1459 return iterator(d->m.upper_bound(key));
1462 const_iterator upperBound(
const Key &key)
const
1465 return const_iterator();
1466 return const_iterator(d->m.upper_bound(key));
1469 iterator insert(
const Key &key,
const T &value)
1471 const auto copy = d.isShared() ? *
this : QMultiMap();
1475 auto i = d->m.lower_bound(key);
1476 return iterator(d->m.insert(i, {key, value}));
1479 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1481 const auto copy = d.isShared() ? *
this : QMultiMap();
1482 typename Map::const_iterator dpos;
1483 if (!d || d.isShared()) {
1484 auto posDistance = d ? std::distance(d->m.cbegin(), pos.i) : 0;
1486 dpos = std::next(d->m.cbegin(), posDistance);
1490 return iterator(d->m.insert(dpos, {key, value}));
1493#if QT_DEPRECATED_SINCE(6
, 0
)
1494 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1495 iterator insertMulti(
const Key &key,
const T &value)
1497 return insert(key, value);
1499 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1500 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1502 return insert(pos, key, value);
1505 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1506 void insert(
const QMultiMap<Key, T> &map)
1511 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1512 void insert(QMultiMap<Key, T> &&map)
1514 unite(std::move(map));
1518 iterator replace(
const Key &key,
const T &value)
1520 const auto copy = d.isShared() ? *
this : QMultiMap();
1527 auto i = d->m.find(key);
1528 if (i != d->m.end())
1531 i = d->m.insert({key, value});
1538 inline bool empty()
const {
return isEmpty(); }
1540 std::pair<iterator, iterator> equal_range(
const Key &akey)
1542 const auto copy = d.isShared() ? *
this : QMultiMap();
1544 auto result = d->m.equal_range(akey);
1545 return {iterator(result.first), iterator(result.second)};
1548 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1552 auto result = d->m.equal_range(akey);
1553 return {const_iterator(result.first), const_iterator(result.second)};
1556 QMultiMap &unite(
const QMultiMap &other)
1558 if (other.isEmpty())
1563 auto copy = other.d->m;
1564#ifdef __cpp_lib_node_extract
1565 copy.merge(std::move(d->m));
1567 copy.insert(std::make_move_iterator(d->m.begin()),
1568 std::make_move_iterator(d->m.end()));
1570 d->m = std::move(copy);
1574 QMultiMap &unite(QMultiMap<Key, T> &&other)
1576 if (!other.d || other.d->m.empty())
1579 if (other.d.isShared()) {
1587#ifdef __cpp_lib_node_extract
1588 other.d->m.merge(std::move(d->m));
1590 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1591 std::make_move_iterator(d->m.end()));
1593 *
this = std::move(other);