193 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
195 friend class QMultiMap<
Key,
T>;
215 insert(p.first, p.second);
218 explicit QMap(
const std::map<Key, T> &other)
223 explicit QMap(std::map<Key, T> &&other)
241 return std::move(d->m);
249 template <
typename AKey = Key,
typename AT = T,
250 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>
258 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
260 QT_DECLARE_EQUALITY_OPERATORS_HELPER(
QMap,
QMap, ,
noexcept(
false),
261 template <
typename AKey = Key,
typename AT = T,
262 QTypeTraits::compare_eq_result_container<QMap, AKey, AT> =
true>)
336#ifdef __cpp_lib_node_extract
438 friend class QMap<Key, T>;
439 friend class const_iterator;
441 typename Map::iterator i;
442 explicit iterator(
typename Map::iterator it) : i(it) {}
444 using iterator_category =
std::bidirectional_iterator_tag;
445 using difference_type = qptrdiff;
446 using value_type = T;
448 using reference = T &;
450 iterator() =
default;
452 const Key &key()
const {
return i->first; }
453 T &value()
const {
return i->second; }
454 T &operator*()
const {
return i->second; }
455 T *operator->()
const {
return &i->second; }
456 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
457 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
459 iterator &operator++()
464 iterator operator++(
int)
470 iterator &operator--()
475 iterator operator--(
int)
482#if QT_DEPRECATED_SINCE(6
, 0
)
483 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
485 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
487 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
489 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
491 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
492 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
494 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
495 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
497 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
499 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
501 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
503 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
509 friend class QMap<Key, T>;
510 typename Map::const_iterator i;
511 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
514 using iterator_category =
std::bidirectional_iterator_tag;
515 using difference_type = qptrdiff;
516 using value_type = T;
517 using pointer =
const T *;
518 using reference =
const T &;
520 const_iterator() =
default;
521 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
523 const Key &key()
const {
return i->first; }
524 const T &value()
const {
return i->second; }
525 const T &operator*()
const {
return i->second; }
526 const T *operator->()
const {
return &i->second; }
527 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
528 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
530 const_iterator &operator++()
535 const_iterator operator++(
int)
537 const_iterator r = *
this;
541 const_iterator &operator--()
546 const_iterator operator--(
int)
548 const_iterator r = *
this;
553#if QT_DEPRECATED_SINCE(6
, 0
)
554 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
556 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
558 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
560 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
562 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMap iterators are not random access")
563 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
565 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMap iterators are not random access")
566 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
568 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMap iterators are not random access")
570 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
572 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMap iterators are not random access")
574 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
583 typedef typename const_iterator::iterator_category iterator_category;
584 typedef typename const_iterator::difference_type difference_type;
585 typedef Key value_type;
586 typedef const Key *pointer;
587 typedef const Key &reference;
589 key_iterator() =
default;
590 explicit key_iterator(const_iterator o) : i(o) { }
592 const Key &operator*()
const {
return i.key(); }
593 const Key *operator->()
const {
return &i.key(); }
594 bool operator==(key_iterator o)
const {
return i == o.i; }
595 bool operator!=(key_iterator o)
const {
return i != o.i; }
597 inline key_iterator &operator++() { ++i;
return *
this; }
598 inline key_iterator operator++(
int) {
return key_iterator(i++);}
599 inline key_iterator &operator--() { --i;
return *
this; }
600 inline key_iterator operator--(
int) {
return key_iterator(i--); }
601 const_iterator base()
const {
return i; }
604 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
605 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
608 iterator begin() { detach();
return iterator(d->m.begin()); }
609 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
610 const_iterator constBegin()
const {
return begin(); }
611 const_iterator cbegin()
const {
return begin(); }
612 iterator end() { detach();
return iterator(d->m.end()); }
613 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
614 const_iterator constEnd()
const {
return end(); }
615 const_iterator cend()
const {
return end(); }
616 key_iterator keyBegin()
const {
return key_iterator(begin()); }
617 key_iterator keyEnd()
const {
return key_iterator(end()); }
618 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
619 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
620 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
621 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
622 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
623 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
624 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMap &>(*
this); }
625 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMap &>(*
this); }
626 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
627 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMap>(std::move(*
this)); }
629 iterator erase(const_iterator it)
631 return erase(it,
std::next(it));
634 iterator erase(const_iterator afirst, const_iterator alast)
640 return iterator(d->m.erase(afirst.i, alast.i));
642 auto result = d->erase(afirst.i, alast.i);
643 d.reset(result.data);
644 return iterator(result.it);
648 typedef iterator Iterator;
649 typedef const_iterator ConstIterator;
651 iterator find(
const Key &key)
653 const auto copy = d.isShared() ? *
this : QMap();
655 return iterator(d->m.find(key));
658 const_iterator find(
const Key &key)
const
661 return const_iterator();
662 return const_iterator(d->m.find(key));
665 const_iterator constFind(
const Key &key)
const
670 iterator lowerBound(
const Key &key)
672 const auto copy = d.isShared() ? *
this : QMap();
674 return iterator(d->m.lower_bound(key));
677 const_iterator lowerBound(
const Key &key)
const
680 return const_iterator();
681 return const_iterator(d->m.lower_bound(key));
684 iterator upperBound(
const Key &key)
686 const auto copy = d.isShared() ? *
this : QMap();
688 return iterator(d->m.upper_bound(key));
691 const_iterator upperBound(
const Key &key)
const
694 return const_iterator();
695 return const_iterator(d->m.upper_bound(key));
698 iterator insert(
const Key &key,
const T &value)
700 const auto copy = d.isShared() ? *
this : QMap();
703 return iterator(d->m.insert_or_assign(key, value).first);
706 iterator insert(const_iterator pos,
const Key &key,
const T &value)
709 typename Map::const_iterator dpos;
710 const auto copy = d.isShared() ? *
this : QMap();
711 if (!d || d.isShared()) {
712 auto posDistance = d ? std::distance(d->m.cbegin(), pos.i) : 0;
714 dpos =
std::next(d->m.cbegin(), posDistance);
718 return iterator(d->m.insert_or_assign(dpos, key, value));
721 void insert(
const QMap<Key, T> &map)
729#ifdef __cpp_lib_node_extract
730 auto copy = map.d->m;
731 copy.merge(
std::move(d->m));
732 d->m = std::move(copy);
736 auto insertionHint = d->m.end();
737 auto mapIt = map.d->m.crbegin();
738 auto end = map.d->m.crend();
739 for (; mapIt != end; ++mapIt)
740 insertionHint = d->m.insert_or_assign(insertionHint, mapIt->first, mapIt->second);
744 void insert(
QMap<Key, T> &&map)
746 if (!map.d || map.d->m.empty())
749 if (map.d.isShared()) {
757#ifdef __cpp_lib_node_extract
758 map.d->m.merge(
std::move(d->m));
759 *
this =
std::move(map);
762 auto insertionHint = d->m.end();
763 auto mapIt = map.d->m.crbegin();
764 auto end = map.d->m.crend();
765 for (; mapIt != end; ++mapIt)
766 insertionHint = d->m.insert_or_assign(insertionHint, std::move(mapIt->first), std::move(mapIt->second));
772 inline bool empty()
const
777 std::pair<iterator, iterator> equal_range(
const Key &akey)
779 const auto copy = d.isShared() ? *
this : QMap();
781 auto result = d->m.equal_range(akey);
782 return {iterator(result.first), iterator(result.second)};
785 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
789 auto result = d->m.equal_range(akey);
790 return {const_iterator(result.first), const_iterator(result.second)};
797# if defined(Q_CC_GHS) || defined (Q_CC_MSVC)
807 qHash(
const M &key, size_t seed = 0)
813 return std::accumulate(key.d->m.begin(), key.d->m.end(), seed,
814 QtPrivate::QHashCombine{seed});
836 using Map = std::multimap<Key, T>;
837 using MapData = QMapData<Map>;
838 QtPrivate::QExplicitlySharedDataPointerV2<MapData> d;
841 using key_type = Key;
842 using mapped_type = T;
843 using difference_type = qptrdiff;
844 using size_type = qsizetype;
846 QMultiMap() =
default;
850 QMultiMap(std::initializer_list<std::pair<Key,T>> list)
853 insert(p.first, p.second);
856 void swap(QMultiMap<Key, T> &other)
noexcept
861 explicit QMultiMap(
const QMap<Key, T> &other)
862 : d(other.isEmpty() ?
nullptr :
new MapData)
866 d->m.insert(other.d->m.begin(),
871 explicit QMultiMap(QMap<Key, T> &&other)
872 : d(other.isEmpty() ?
nullptr :
new MapData)
876 if (other.d.isShared()) {
877 d->m.insert(other.d->m.begin(),
880#ifdef __cpp_lib_node_extract
881 d->m.merge(std::move(other.d->m));
883 d->m.insert(std::make_move_iterator(other.d->m.begin()),
884 std::make_move_iterator(other.d->m.end()));
890 explicit QMultiMap(
const std::multimap<Key, T> &other)
891 : d(other.empty() ?
nullptr :
new MapData(other))
895 explicit QMultiMap(std::multimap<Key, T> &&other)
896 : d(other.empty() ?
nullptr :
new MapData(std::move(other)))
901 Q_DECL_DEPRECATED_X(
"Use toStdMultiMap instead")
902 std::multimap<Key, T> toStdMap()
const
904 return toStdMultiMap();
907 std::multimap<Key, T> toStdMultiMap()
const &
914 std::multimap<Key, T> toStdMultiMap() &&
920 return std::move(d->m);
928 template <
typename AKey = Key,
typename AT = T,
929 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>
930 friend bool comparesEqual(
const QMultiMap &lhs,
const QMultiMap &rhs)
937 return rhs.d ? (lhs.d->m == rhs.d->m) : lhs.d->m.empty();
939 QT_DECLARE_EQUALITY_OPERATORS_HELPER(QMultiMap, QMultiMap, ,
noexcept(
false),
940 template <
typename AKey = Key,
typename AT = T,
941 QTypeTraits::compare_eq_result_container<QMultiMap, AKey, AT> =
true>)
945 friend bool operator==(
const QMultiMap &lhs,
const QMultiMap &rhs);
946 friend bool operator!=(
const QMultiMap &lhs,
const QMultiMap &rhs);
949 size_type size()
const {
return d ? size_type(d->m.size()) : size_type(0); }
952 bool isEmpty()
const {
return d ? d->m.empty() :
true; }
959 d.reset(
new MapData);
962 bool isDetached()
const noexcept
964 return d ? !d.isShared() :
false;
967 bool isSharedWith(
const QMultiMap<Key, T> &other)
const noexcept
983 size_type remove(
const Key &key)
989 return size_type(d->m.erase(key));
991 MapData *newData =
new MapData;
992 size_type result = newData->copyIfNotEquivalentTo(d->m, key);
999 size_type remove(
const Key &key,
const T &value)
1007 const Key keyCopy = key;
1008 const T valueCopy = value;
1013 size_type result = 0;
1014 const auto &keyCompare = d->m.key_comp();
1016 auto i = d->m.find(keyCopy);
1017 const auto e = d->m.end();
1019 while (i != e && !keyCompare(keyCopy, i->first)) {
1020 if (i->second == valueCopy) {
1031 template <
typename Predicate>
1032 size_type removeIf(Predicate pred)
1034 return QtPrivate::associative_erase_if(*
this, pred);
1037 T take(
const Key &key)
1042 const auto copy = d.isShared() ? *
this : QMultiMap();
1048#ifdef __cpp_lib_node_extract
1049 if (
const auto node = d->m.extract(key))
1050 return std::move(node.mapped());
1052 auto i = d->m.find(key);
1053 if (i != d->m.end()) {
1055 T result(std::move(i->second));
1063 bool contains(
const Key &key)
const
1067 auto i = d->m.find(key);
1068 return i != d->m.end();
1071 bool contains(
const Key &key,
const T &value)
const
1073 return find(key, value) != end();
1076 Key key(
const T &value,
const Key &defaultKey = Key())
const
1081 return d->key(value, defaultKey);
1084 T value(
const Key &key,
const T &defaultValue = T())
const
1087 return defaultValue;
1088 const auto i = d->m.find(key);
1089 if (i != d->m.cend())
1091 return defaultValue;
1094 QList<Key> keys()
const
1101 QList<Key> keys(
const T &value)
const
1105 return d->keys(value);
1108 QList<Key> uniqueKeys()
const
1114 result.reserve(size());
1116 std::unique_copy(keyBegin(), keyEnd(),
1117 std::back_inserter(result));
1119 result.shrink_to_fit();
1123 QList<T> values()
const
1130 QList<T> values(
const Key &key)
const
1133 const auto range = equal_range(key);
1134 result.reserve(std::distance(range.first, range.second));
1135 std::copy(range.first, range.second, std::back_inserter(result));
1139 size_type count(
const Key &key)
const
1143 return d->count(key);
1146 size_type count(
const Key &key,
const T &value)
const
1152 auto range = d->m.equal_range(key);
1154 return size_type(std::count_if(range.first,
1156 MapData::valueIsEqualTo(value)));
1159 inline const Key &firstKey()
const { Q_ASSERT(!isEmpty());
return constBegin().key(); }
1160 inline const Key &lastKey()
const { Q_ASSERT(!isEmpty());
return std::next(constEnd(), -1).key(); }
1162 inline T &first() { Q_ASSERT(!isEmpty());
return *begin(); }
1163 inline const T &first()
const { Q_ASSERT(!isEmpty());
return *constBegin(); }
1164 inline T &last() { Q_ASSERT(!isEmpty());
return *std::next(end(), -1); }
1165 inline const T &last()
const { Q_ASSERT(!isEmpty());
return *std::next(constEnd(), -1); }
1167 class const_iterator;
1171 friend class QMultiMap<Key, T>;
1172 friend class const_iterator;
1174 typename Map::iterator i;
1175 explicit iterator(
typename Map::iterator it) : i(it) {}
1177 using iterator_category = std::bidirectional_iterator_tag;
1178 using difference_type = qptrdiff;
1179 using value_type = T;
1180 using pointer = T *;
1181 using reference = T &;
1183 iterator() =
default;
1185 const Key &key()
const {
return i->first; }
1186 T &value()
const {
return i->second; }
1187 T &operator*()
const {
return i->second; }
1188 T *operator->()
const {
return &i->second; }
1189 friend bool operator==(
const iterator &lhs,
const iterator &rhs) {
return lhs.i == rhs.i; }
1190 friend bool operator!=(
const iterator &lhs,
const iterator &rhs) {
return lhs.i != rhs.i; }
1192 iterator &operator++()
1197 iterator operator++(
int)
1203 iterator &operator--()
1208 iterator operator--(
int)
1215#if QT_DEPRECATED_SINCE(6
, 0
)
1216 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1218 friend iterator operator+(iterator it, difference_type j) {
return std::next(it, j); }
1220 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1222 friend iterator operator-(iterator it, difference_type j) {
return std::prev(it, j); }
1224 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1225 iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1227 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1228 iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1230 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1232 friend iterator operator+(difference_type j, iterator it) {
return std::next(it, j); }
1234 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1236 friend iterator operator-(difference_type j, iterator it) {
return std::prev(it, j); }
1240 class const_iterator
1242 friend class QMultiMap<Key, T>;
1243 typename Map::const_iterator i;
1244 explicit const_iterator(
typename Map::const_iterator it) : i(it) {}
1247 using iterator_category = std::bidirectional_iterator_tag;
1248 using difference_type = qptrdiff;
1249 using value_type = T;
1250 using pointer =
const T *;
1251 using reference =
const T &;
1253 const_iterator() =
default;
1254 Q_IMPLICIT const_iterator(
const iterator &o) : i(o.i) {}
1256 const Key &key()
const {
return i->first; }
1257 const T &value()
const {
return i->second; }
1258 const T &operator*()
const {
return i->second; }
1259 const T *operator->()
const {
return &i->second; }
1260 friend bool operator==(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i == rhs.i; }
1261 friend bool operator!=(
const const_iterator &lhs,
const const_iterator &rhs) {
return lhs.i != rhs.i; }
1263 const_iterator &operator++()
1268 const_iterator operator++(
int)
1270 const_iterator r = *
this;
1274 const_iterator &operator--()
1279 const_iterator operator--(
int)
1281 const_iterator r = *
this;
1286#if QT_DEPRECATED_SINCE(6
, 0
)
1287 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1289 friend const_iterator operator+(const_iterator it, difference_type j) {
return std::next(it, j); }
1291 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1293 friend const_iterator operator-(const_iterator it, difference_type j) {
return std::prev(it, j); }
1295 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next or std::advance; QMultiMap iterators are not random access")
1296 const_iterator &operator+=(difference_type j) { std::advance(*
this, j);
return *
this; }
1298 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev or std::advance; QMultiMap iterators are not random access")
1299 const_iterator &operator-=(difference_type j) { std::advance(*
this, -j);
return *
this; }
1301 QT_DEPRECATED_VERSION_X_6_0(
"Use std::next; QMultiMap iterators are not random access")
1303 friend const_iterator operator+(difference_type j, const_iterator it) {
return std::next(it, j); }
1305 QT_DEPRECATED_VERSION_X_6_0(
"Use std::prev; QMultiMap iterators are not random access")
1307 friend const_iterator operator-(difference_type j, const_iterator it) {
return std::prev(it, j); }
1316 typedef typename const_iterator::iterator_category iterator_category;
1317 typedef typename const_iterator::difference_type difference_type;
1318 typedef Key value_type;
1319 typedef const Key *pointer;
1320 typedef const Key &reference;
1322 key_iterator() =
default;
1323 explicit key_iterator(const_iterator o) : i(o) { }
1325 const Key &operator*()
const {
return i.key(); }
1326 const Key *operator->()
const {
return &i.key(); }
1327 bool operator==(key_iterator o)
const {
return i == o.i; }
1328 bool operator!=(key_iterator o)
const {
return i != o.i; }
1330 inline key_iterator &operator++() { ++i;
return *
this; }
1331 inline key_iterator operator++(
int) {
return key_iterator(i++);}
1332 inline key_iterator &operator--() { --i;
return *
this; }
1333 inline key_iterator operator--(
int) {
return key_iterator(i--); }
1334 const_iterator base()
const {
return i; }
1337 typedef QKeyValueIterator<
const Key&,
const T&, const_iterator> const_key_value_iterator;
1338 typedef QKeyValueIterator<
const Key&, T&, iterator> key_value_iterator;
1341 iterator begin() { detach();
return iterator(d->m.begin()); }
1342 const_iterator begin()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.cbegin()); }
1343 const_iterator constBegin()
const {
return begin(); }
1344 const_iterator cbegin()
const {
return begin(); }
1345 iterator end() { detach();
return iterator(d->m.end()); }
1346 const_iterator end()
const {
if (!d)
return const_iterator();
return const_iterator(d->m.end()); }
1347 const_iterator constEnd()
const {
return end(); }
1348 const_iterator cend()
const {
return end(); }
1349 key_iterator keyBegin()
const {
return key_iterator(begin()); }
1350 key_iterator keyEnd()
const {
return key_iterator(end()); }
1351 key_value_iterator keyValueBegin() {
return key_value_iterator(begin()); }
1352 key_value_iterator keyValueEnd() {
return key_value_iterator(end()); }
1353 const_key_value_iterator keyValueBegin()
const {
return const_key_value_iterator(begin()); }
1354 const_key_value_iterator constKeyValueBegin()
const {
return const_key_value_iterator(begin()); }
1355 const_key_value_iterator keyValueEnd()
const {
return const_key_value_iterator(end()); }
1356 const_key_value_iterator constKeyValueEnd()
const {
return const_key_value_iterator(end()); }
1357 auto asKeyValueRange() & {
return QtPrivate::QKeyValueRange<QMultiMap &>(*
this); }
1358 auto asKeyValueRange()
const & {
return QtPrivate::QKeyValueRange<
const QMultiMap &>(*
this); }
1359 auto asKeyValueRange() && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1360 auto asKeyValueRange()
const && {
return QtPrivate::QKeyValueRange<QMultiMap>(std::move(*
this)); }
1362 iterator erase(const_iterator it)
1364 return erase(it, std::next(it));
1367 iterator erase(const_iterator afirst, const_iterator alast)
1373 return iterator(d->m.erase(afirst.i, alast.i));
1375 auto result = d->erase(afirst.i, alast.i);
1376 d.reset(result.data);
1377 return iterator(result.it);
1381 typedef iterator Iterator;
1382 typedef const_iterator ConstIterator;
1384 size_type count()
const
1389 iterator find(
const Key &key)
1391 const auto copy = d.isShared() ? *
this : QMultiMap();
1393 return iterator(d->m.find(key));
1396 const_iterator find(
const Key &key)
const
1399 return const_iterator();
1400 return const_iterator(d->m.find(key));
1403 const_iterator constFind(
const Key &key)
const
1408 iterator find(
const Key &key,
const T &value)
1410 const auto copy = d.isShared() ? *
this : QMultiMap();
1414 auto range = d->m.equal_range(key);
1415 auto i = std::find_if(range.first, range.second,
1416 MapData::valueIsEqualTo(value));
1418 if (i != range.second)
1420 return iterator(d->m.end());
1423 const_iterator find(
const Key &key,
const T &value)
const
1426 return const_iterator();
1428 auto range = d->m.equal_range(key);
1429 auto i = std::find_if(range.first, range.second,
1430 MapData::valueIsEqualTo(value));
1432 if (i != range.second)
1433 return const_iterator(i);
1434 return const_iterator(d->m.end());
1437 const_iterator constFind(
const Key &key,
const T &value)
const
1439 return find(key, value);
1442 iterator lowerBound(
const Key &key)
1444 const auto copy = d.isShared() ? *
this : QMultiMap();
1446 return iterator(d->m.lower_bound(key));
1449 const_iterator lowerBound(
const Key &key)
const
1452 return const_iterator();
1453 return const_iterator(d->m.lower_bound(key));
1456 iterator upperBound(
const Key &key)
1458 const auto copy = d.isShared() ? *
this : QMultiMap();
1460 return iterator(d->m.upper_bound(key));
1463 const_iterator upperBound(
const Key &key)
const
1466 return const_iterator();
1467 return const_iterator(d->m.upper_bound(key));
1470 iterator insert(
const Key &key,
const T &value)
1472 const auto copy = d.isShared() ? *
this : QMultiMap();
1476 auto i = d->m.lower_bound(key);
1477 return iterator(d->m.insert(i, {key, value}));
1480 iterator insert(const_iterator pos,
const Key &key,
const T &value)
1482 const auto copy = d.isShared() ? *
this : QMultiMap();
1483 typename Map::const_iterator dpos;
1484 if (!d || d.isShared()) {
1485 auto posDistance = d ? std::distance(d->m.cbegin(), pos.i) : 0;
1487 dpos = std::next(d->m.cbegin(), posDistance);
1491 return iterator(d->m.insert(dpos, {key, value}));
1494#if QT_DEPRECATED_SINCE(6
, 0
)
1495 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1496 iterator insertMulti(
const Key &key,
const T &value)
1498 return insert(key, value);
1500 QT_DEPRECATED_VERSION_X_6_0(
"Use insert() instead")
1501 iterator insertMulti(const_iterator pos,
const Key &key,
const T &value)
1503 return insert(pos, key, value);
1506 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1507 void insert(
const QMultiMap<Key, T> &map)
1512 QT_DEPRECATED_VERSION_X_6_0(
"Use unite() instead")
1513 void insert(QMultiMap<Key, T> &&map)
1515 unite(std::move(map));
1519 iterator replace(
const Key &key,
const T &value)
1521 const auto copy = d.isShared() ? *
this : QMultiMap();
1528 auto i = d->m.find(key);
1529 if (i != d->m.end())
1532 i = d->m.insert({key, value});
1539 inline bool empty()
const {
return isEmpty(); }
1541 std::pair<iterator, iterator> equal_range(
const Key &akey)
1543 const auto copy = d.isShared() ? *
this : QMultiMap();
1545 auto result = d->m.equal_range(akey);
1546 return {iterator(result.first), iterator(result.second)};
1549 std::pair<const_iterator, const_iterator> equal_range(
const Key &akey)
const
1553 auto result = d->m.equal_range(akey);
1554 return {const_iterator(result.first), const_iterator(result.second)};
1557 QMultiMap &unite(
const QMultiMap &other)
1559 if (other.isEmpty())
1564 auto copy = other.d->m;
1565#ifdef __cpp_lib_node_extract
1566 copy.merge(std::move(d->m));
1568 copy.insert(std::make_move_iterator(d->m.begin()),
1569 std::make_move_iterator(d->m.end()));
1571 d->m = std::move(copy);
1575 QMultiMap &unite(QMultiMap<Key, T> &&other)
1577 if (!other.d || other.d->m.empty())
1580 if (other.d.isShared()) {
1588#ifdef __cpp_lib_node_extract
1589 other.d->m.merge(std::move(d->m));
1591 other.d->m.insert(std::make_move_iterator(d->m.begin()),
1592 std::make_move_iterator(d->m.end()));
1594 *
this = std::move(other);