192 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
194 friend class QMultiMap<
Key,
T>;
197 using key_type = Key;
198 using mapped_type = 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>)
431 friend class QMap<Key, T>;
432 friend class const_iterator;
434 typename Map::iterator i;
435 explicit iterator(
typename Map::iterator it) : i(it) {}
437 using iterator_category =
std::bidirectional_iterator_tag;
438 using difference_type = qptrdiff;
439 using value_type = T;
441 using reference = T &;
443 iterator() =
default;
445 const Key &key()
const {
return i->first; }
446 T &value()
const {
return i->second; }
447 T &operator*()
const {
return i->second; }
448 T *operator->()
const {
return &i->second; }
449 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
450 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
452 iterator &operator++()
457 iterator operator++(
int)
463 iterator &operator--()
468 iterator operator--(
int)
475#if QT_DEPRECATED_SINCE(6
, 0
)
476 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
478 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
480 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
482 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
484 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
485 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
487 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
488 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
490 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
492 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
494 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
496 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
502 friend class QMap<Key, T>;
503 typename Map::const_iterator i;
504 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
507 using iterator_category =
std::bidirectional_iterator_tag;
508 using difference_type = qptrdiff;
509 using value_type = T;
510 using pointer =
const T *;
511 using reference =
const T &;
513 const_iterator() =
default;
514 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
516 const Key &key()
const {
return i->first; }
517 const T &value()
const {
return i->second; }
518 const T &operator*()
const {
return i->second; }
519 const T *operator->()
const {
return &i->second; }
520 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
521 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
523 const_iterator &operator++()
528 const_iterator operator++(
int)
530 const_iterator r = *
this;
534 const_iterator &operator--()
539 const_iterator operator--(
int)
541 const_iterator r = *
this;
546#if QT_DEPRECATED_SINCE(6
, 0
)
547 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
549 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
551 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
553 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
555 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
556 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
558 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
559 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
561 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
563 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
565 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
567 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
576 typedef typename const_iterator::iterator_category iterator_category;
577 typedef typename const_iterator::difference_type difference_type;
578 typedef Key value_type;
579 typedef const Key *pointer;
580 typedef const Key &reference;
582 key_iterator() =
default;
583 explicit key_iterator(const_iterator o) : i(o) { }
585 const Key &operator*()
const {
return i.key(); }
586 const Key *operator->()
const {
return &i.key(); }
587 bool operator==(key_iterator o)
const {
return i == o.i; }
588 bool operator!=(key_iterator o)
const {
return i != o.i; }
590 inline key_iterator &operator++() { ++i;
return *
this; }
591 inline key_iterator operator++(
int) {
return key_iterator(i++);}
592 inline key_iterator &operator--() { --i;
return *
this; }
593 inline key_iterator operator--(
int) {
return key_iterator(i--); }
594 const_iterator base()
const {
return i; }
597 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
598 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
601 iterator begin() { detach();
return iterator(d->m.begin()); }
602 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
603 const_iterator constBegin()
const {
return begin(); }
604 const_iterator cbegin()
const {
return begin(); }
605 iterator end() { detach();
return iterator(d->m.end()); }
606 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
607 const_iterator constEnd()
const {
return end(); }
608 const_iterator cend()
const {
return end(); }
609 key_iterator keyBegin()
const {
return key_iterator(begin()); }
610 key_iterator keyEnd()
const {
return key_iterator(end()); }
611 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
612 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
613 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
614 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
615 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
616 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
617 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange(*
this); }
618 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange(*
this); }
619 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange(std::move(*
this)); }
620 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange(std::move(*
this)); }
622 iterator erase(const_iterator it)
624 return erase(it,
std::next(it));
627 iterator erase(const_iterator afirst, const_iterator alast)
633 return iterator(d->m.erase(afirst.i, alast.i));
635 auto result = d->erase(afirst.i, alast.i);
636 d.reset(result.data);
637 return iterator(result.it);
641 typedef iterator Iterator;
642 typedef const_iterator ConstIterator;
644 iterator find(
const Key &key)
646 const auto copy = d.isShared() ? *
this : QMap();
648 return iterator(d->m.find(key));
651 const_iterator find(
const Key &key)
const
654 return const_iterator();
655 return const_iterator(d->m.find(key));
658 const_iterator constFind(
const Key &key)
const
663 iterator lowerBound(
const Key &key)
665 const auto copy = d.isShared() ? *
this : QMap();
667 return iterator(d->m.lower_bound(key));
670 const_iterator lowerBound(
const Key &key)
const
673 return const_iterator();
674 return const_iterator(d->m.lower_bound(key));
677 iterator upperBound(
const Key &key)
679 const auto copy = d.isShared() ? *
this : QMap();
681 return iterator(d->m.upper_bound(key));
684 const_iterator upperBound(
const Key &key)
const
687 return const_iterator();
688 return const_iterator(d->m.upper_bound(key));
691 iterator insert(
const Key &key,
const T &value)
693 const auto copy = d.isShared() ? *
this : QMap();
696 return iterator(d->m.insert_or_assign(key, value).first);
699 iterator insert(const_iterator pos,
const Key &key,
const T &value)
702 typename Map::const_iterator dpos;
703 const auto copy = d.isShared() ? *
this : QMap();
704 if (!d || d.isShared()) {
705 auto posDistance = d ? std::distance(d->m.cbegin(), pos.i) : 0;
707 dpos = std::next(d->m.cbegin(), posDistance);
711 return iterator(d->m.insert_or_assign(dpos, key, value));
714 void insert(
const QMap<Key, T> &map)
722#ifdef __cpp_lib_node_extract
723 auto copy = map.d->m;
724 copy.merge(std::move(d->m));
725 d->m = std::move(copy);
729 auto insertionHint = d->m.end();
730 auto mapIt = map.d->m.crbegin();
731 auto end = map.d->m.crend();
732 for (; mapIt != end; ++mapIt)
733 insertionHint = d->m.insert_or_assign(insertionHint, mapIt->first, mapIt->second);
737 void insert(
QMap<Key, T> &&map)
739 if (!map.d || map.d->m.empty())
742 if (map.d.isShared()) {
750#ifdef __cpp_lib_node_extract
751 map.d->m.merge(std::move(d->m));
752 *
this =
std::move(map);
755 auto insertionHint = d->m.end();
756 auto mapIt = map.d->m.crbegin();
757 auto end = map.d->m.crend();
758 for (; mapIt != end; ++mapIt)
759 insertionHint = d->m.insert_or_assign(insertionHint, std::move(mapIt->first), std::move(mapIt->second));
765 inline bool empty()
const
770 std::pair<iterator, iterator> equal_range(
const Key &akey)
772 const auto copy = d.isShared() ? *
this : QMap();
774 auto result = d->m.equal_range(akey);
775 return {iterator(result.first), iterator(result.second)};
778 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
782 auto result = d->m.equal_range(akey);
783 return {const_iterator(result.first), const_iterator(result.second)};
790# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
800 qHash(
const M &key, size_t seed = 0)
806 return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
807 QtPrivate::QHashCombine{});
829 using Map = std::multimap<Key, T>;
830 using MapData = QMapData<Map>;
831 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
834 using key_type = Key;
835 using mapped_type = T;
836 using difference_type = qptrdiff;
837 using size_type = qsizetype;
839 QMultiMap() =
default;
843 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
846 insert(p.first, p.second);
849 void swap(QMultiMap<Key, T> &other)
noexcept
854 explicit QMultiMap(
const QMap<Key, T> &other)
855 : d(other.isEmpty() ?
nullptr :
new MapData)
859 d->m.insert(other.d->m.begin(),
864 explicit QMultiMap(QMap<Key, T> &&other)
865 : d(other.isEmpty() ?
nullptr :
new MapData)
869 if (other.d.isShared()) {
870 d->m.insert(other.d->m.begin(),
873#ifdef __cpp_lib_node_extract
874 d->m.merge(std::move(other.d->m));
876 d->m.insert(std::make_move_iterator(other.d->m.begin()),
877 std::make_move_iterator(other.d->m.end()));
883 explicit QMultiMap(
const std::multimap<Key, T> &other)
884 : d(other.empty() ?
nullptr :
new MapData(other))
888 explicit QMultiMap(std::multimap<Key, T> &&other)
889 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
894 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
895 std::multimap<Key, T> toStdMap()
const
897 return toStdMultiMap();
900 std::multimap<Key, T> toStdMultiMap()
const &
907 std::multimap<Key, T> toStdMultiMap() &&
913 return std::move(d->m);
921 template <
typename AKey = Key,
typename AT = T,
922 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
923 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
930 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
932 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
933 template <
typename AKey = Key,
typename AT = T,
934 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
938 friend bool operator==(
const QMultiMap &lhs,
const QMultiMap &rhs);
939 friend bool operator!=(
const QMultiMap &lhs,
const QMultiMap &rhs);
942 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
945 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
952 d.reset(
new MapData);
955 bool isDetached()
const noexcept
957 return d ? !d.isShared() :
false;
960 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
976 size_type remove(
const Key &key)
982 return size_type(d->m.erase(key));
984 MapData *newData =
new MapData;
985 size_type result = newData->copyIfNotEquivalentTo(d->m, key);
992 size_type remove(
const Key &key,
const T &value)
1000 const Key keyCopy = key;
1001 const T valueCopy = value;
1006 size_type result = 0;
1007 const auto &keyCompare = d->m.key_comp();
1009 auto i = d->m.find(keyCopy);
1010 const auto e = d->m.end();
1012 while (i != e && !keyCompare(keyCopy, i->first)) {
1013 if (i->second == valueCopy) {
1024 template <
typename Predicate>
1025 size_type removeIf(Predicate pred)
1027 return QtPrivate::associative_erase_if(*
this, pred);
1030 T take(
const Key &key)
1035 const auto copy = d.isShared() ? *
this : QMultiMap();
1041 auto i = d->m.find(key);
1042 if (i != d->m.end()) {
1043 T result(std::move(i->second));
1050 bool contains(
const Key &key)
const
1054 auto i = d->m.find(key);
1055 return i != d->m.end();
1058 bool contains(
const Key &key,
const T &value)
const
1060 return find(key, value) != end();
1063 Key key(
const T &value,
const Key &defaultKey = Key())
const
1068 return d->key(value, defaultKey);
1071 T value(
const Key &key,
const T &defaultValue = T())
const
1074 return defaultValue;
1075 const auto i = d->m.find(key);
1076 if (i != d->m.cend())
1078 return defaultValue;
1081 QList<Key> keys()
const
1088 QList<Key> keys(
const T &value)
const
1092 return d->keys(value);
1095 QList<Key> uniqueKeys()
const
1101 result.reserve(size());
1103 std::unique_copy(keyBegin(), keyEnd(),
1104 std::back_inserter(result));
1106 result.shrink_to_fit();
1110 QList<T> values()
const
1117 QList<T> values(
const Key &key)
const
1120 const auto range = equal_range(key);
1121 result.reserve(std::distance(range.first, range.second));
1122 std::copy(range.first, range.second, std::back_inserter(result));
1126 size_type count(
const Key &key)
const
1130 return d->count(key);
1133 size_type count(
const Key &key,
const T &value)
const
1139 auto range = d->m.equal_range(key);
1141 return size_type(std::count_if(range.first,
1143 MapData::valueIsEqualTo(value)));
1146 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1147 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1149 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1150 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1151 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1152 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1154 class const_iterator;
1158 friend class QMultiMap<Key, T>;
1159 friend class const_iterator;
1161 typename Map::iterator i;
1162 explicit iterator(
typename Map::iterator it) : i(it) {}
1164 using iterator_category = std::bidirectional_iterator_tag;
1165 using difference_type = qptrdiff;
1166 using value_type = T;
1167 using pointer = T *;
1168 using reference = T &;
1170 iterator() =
default;
1172 const Key &key()
const {
return i->first; }
1173 T &value()
const {
return i->second; }
1174 T &operator*()
const {
return i->second; }
1175 T *operator->()
const {
return &i->second; }
1176 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1177 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1179 iterator &operator++()
1184 iterator operator++(
int)
1190 iterator &operator--()
1195 iterator operator--(
int)
1202#if QT_DEPRECATED_SINCE(6
, 0
)
1203 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1205 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1207 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1209 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1211 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1212 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1214 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1215 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1217 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1219 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1221 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1223 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1227 class const_iterator
1229 friend class QMultiMap<Key, T>;
1230 typename Map::const_iterator i;
1231 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1234 using iterator_category = std::bidirectional_iterator_tag;
1235 using difference_type = qptrdiff;
1236 using value_type = T;
1237 using pointer =
const T *;
1238 using reference =
const T &;
1240 const_iterator() =
default;
1241 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1243 const Key &key()
const {
return i->first; }
1244 const T &value()
const {
return i->second; }
1245 const T &operator*()
const {
return i->second; }
1246 const T *operator->()
const {
return &i->second; }
1247 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1248 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1250 const_iterator &operator++()
1255 const_iterator operator++(
int)
1257 const_iterator r = *
this;
1261 const_iterator &operator--()
1266 const_iterator operator--(
int)
1268 const_iterator r = *
this;
1273#if QT_DEPRECATED_SINCE(6
, 0
)
1274 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1276 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1278 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1280 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1282 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1283 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1285 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1286 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1288 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1290 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1292 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1294 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1303 typedef typename const_iterator::iterator_category iterator_category;
1304 typedef typename const_iterator::difference_type difference_type;
1305 typedef Key value_type;
1306 typedef const Key *pointer;
1307 typedef const Key &reference;
1309 key_iterator() =
default;
1310 explicit key_iterator(const_iterator o) : i(o) { }
1312 const Key &operator*()
const {
return i.key(); }
1313 const Key *operator->()
const {
return &i.key(); }
1314 bool operator==(key_iterator o)
const {
return i == o.i; }
1315 bool operator!=(key_iterator o)
const {
return i != o.i; }
1317 inline key_iterator &operator++() { ++i;
return *
this; }
1318 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1319 inline key_iterator &operator--() { --i;
return *
this; }
1320 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1321 const_iterator base()
const {
return i; }
1324 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1325 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1328 iterator begin() { detach();
return iterator(d->m.begin()); }
1329 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1330 const_iterator constBegin()
const {
return begin(); }
1331 const_iterator cbegin()
const {
return begin(); }
1332 iterator end() { detach();
return iterator(d->m.end()); }
1333 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1334 const_iterator constEnd()
const {
return end(); }
1335 const_iterator cend()
const {
return end(); }
1336 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1337 key_iterator keyEnd()
const {
return key_iterator(end()); }
1338 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1339 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1340 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1341 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1342 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1343 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1344 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange(*
this); }
1345 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange(*
this); }
1346 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange(std::move(*
this)); }
1347 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange(std::move(*
this)); }
1349 iterator erase(const_iterator it)
1351 return erase(it, std::next(it));
1354 iterator erase(const_iterator afirst, const_iterator alast)
1360 return iterator(d->m.erase(afirst.i, alast.i));
1362 auto result = d->erase(afirst.i, alast.i);
1363 d.reset(result.data);
1364 return iterator(result.it);
1368 typedef iterator Iterator;
1369 typedef const_iterator ConstIterator;
1371 size_type count()
const
1376 iterator find(
const Key &key)
1378 const auto copy = d.isShared() ? *
this : QMultiMap();
1380 return iterator(d->m.find(key));
1383 const_iterator find(
const Key &key)
const
1386 return const_iterator();
1387 return const_iterator(d->m.find(key));
1390 const_iterator constFind(
const Key &key)
const
1395 iterator find(
const Key &key,
const T &value)
1397 const auto copy = d.isShared() ? *
this : QMultiMap();
1401 auto range = d->m.equal_range(key);
1402 auto i = std::find_if(range.first, range.second,
1403 MapData::valueIsEqualTo(value));
1405 if (i != range.second)
1407 return iterator(d->m.end());
1410 const_iterator find(
const Key &key,
const T &value)
const
1413 return const_iterator();
1415 auto range = d->m.equal_range(key);
1416 auto i = std::find_if(range.first, range.second,
1417 MapData::valueIsEqualTo(value));
1419 if (i != range.second)
1420 return const_iterator(i);
1421 return const_iterator(d->m.end());
1424 const_iterator constFind(
const Key &key,
const T &value)
const
1426 return find(key, value);
1429 iterator lowerBound(
const Key &key)
1431 const auto copy = d.isShared() ? *
this : QMultiMap();
1433 return iterator(d->m.lower_bound(key));
1436 const_iterator lowerBound(
const Key &key)
const
1439 return const_iterator();
1440 return const_iterator(d->m.lower_bound(key));
1443 iterator upperBound(
const Key &key)
1445 const auto copy = d.isShared() ? *
this : QMultiMap();
1447 return iterator(d->m.upper_bound(key));
1450 const_iterator upperBound(
const Key &key)
const
1453 return const_iterator();
1454 return const_iterator(d->m.upper_bound(key));
1457 iterator insert(
const Key &key,
const T &value)
1459 const auto copy = d.isShared() ? *
this : QMultiMap();
1463 auto i = d->m.lower_bound(key);
1464 return iterator(d->m.insert(i, {key, value}));
1467 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1469 const auto copy = d.isShared() ? *
this : QMultiMap();
1470 typename Map::const_iterator dpos;
1471 if (!d || d.isShared()) {
1472 auto posDistance = d ? std::distance(d->m.cbegin(), pos.i) : 0;
1474 dpos = std::next(d->m.cbegin(), posDistance);
1478 return iterator(d->m.insert(dpos, {key, value}));
1481#if QT_DEPRECATED_SINCE(6
, 0
)
1482 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1483 iterator insertMulti(
const Key &key,
const T &value)
1485 return insert(key, value);
1487 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1488 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1490 return insert(pos, key, value);
1493 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1494 void insert(
const QMultiMap<Key, T> &map)
1499 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1500 void insert(QMultiMap<Key, T> &&map)
1502 unite(std::move(map));
1506 iterator replace(
const Key &key,
const T &value)
1508 const auto copy = d.isShared() ? *
this : QMultiMap();
1515 auto i = d->m.find(key);
1516 if (i != d->m.end())
1519 i = d->m.insert({key, value});
1526 inline bool empty()
const {
return isEmpty(); }
1528 std::pair<iterator, iterator> equal_range(
const Key &akey)
1530 const auto copy = d.isShared() ? *
this : QMultiMap();
1532 auto result = d->m.equal_range(akey);
1533 return {iterator(result.first), iterator(result.second)};
1536 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1540 auto result = d->m.equal_range(akey);
1541 return {const_iterator(result.first), const_iterator(result.second)};
1544 QMultiMap &unite(
const QMultiMap &other)
1546 if (other.isEmpty())
1551 auto copy = other.d->m;
1552#ifdef __cpp_lib_node_extract
1553 copy.merge(std::move(d->m));
1555 copy.insert(std::make_move_iterator(d->m.begin()),
1556 std::make_move_iterator(d->m.end()));
1558 d->m = std::move(copy);
1562 QMultiMap &unite(QMultiMap<Key, T> &&other)
1564 if (!other.d || other.d->m.empty())
1567 if (other.d.isShared()) {
1575#ifdef __cpp_lib_node_extract
1576 other.d->m.merge(std::move(d->m));
1578 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1579 std::make_move_iterator(d->m.end()));
1581 *
this = std::move(other);