QMultiMap Class
template <typename Key, typename T> class QMultiMapQMultiMap 类是一个模板类,它提供了一个具有多个等效键的关联数组。更多内容...
| 头文件: | #include <QMultiMap> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 所有成员的列表,包括继承的成员
- 已弃用的成员
- QMultiMap 属于“隐式共享类”和“容器类”。
注意:该类中的所有函数均为可重入的。
QMultiMap 比较
| 类别 | 可比较类型 |
|---|---|
| 相等性 | QMultiMap |
公共类型
| class | const_iterator |
| class | iterator |
| class | key_iterator |
| ConstIterator | |
| Iterator | |
| const_key_value_iterator | |
| difference_type | |
| key_type | |
| key_value_iterator | |
| mapped_type | |
| size_type |
公共函数
| QMultiMap() | |
(since 6.0) | QMultiMap(QMap<Key, T> &&other) |
(since 6.0) | QMultiMap(const QMap<Key, T> &other) |
| QMultiMap(const std::multimap<Key, T> &other) | |
| QMultiMap(std::initializer_list<std::pair<Key, T>> list) | |
| QMultiMap(std::multimap<Key, T> &&other) | |
| QMultiMap(const QMultiMap<Key, T> &other) | |
| QMultiMap(QMultiMap<Key, T> &&other) | |
| ~QMultiMap() | |
(since 6.4) auto | asKeyValueRange() && |
(since 6.4) auto | asKeyValueRange() & |
(since 6.4) auto | asKeyValueRange() const && |
(since 6.4) auto | asKeyValueRange() const & |
| QMultiMap<Key, T>::iterator | begin() |
| QMultiMap<Key, T>::const_iterator | begin() const |
| QMultiMap<Key, T>::const_iterator | cbegin() const |
| QMultiMap<Key, T>::const_iterator | cend() const |
| void | clear() |
| QMultiMap<Key, T>::const_iterator | constBegin() const |
| QMultiMap<Key, T>::const_iterator | constEnd() const |
| QMultiMap<Key, T>::const_iterator | constFind(const Key &key) const |
| QMultiMap<Key, T>::const_iterator | constFind(const Key &key, const T &value) const |
| QMultiMap<Key, T>::const_key_value_iterator | constKeyValueBegin() const |
| QMultiMap<Key, T>::const_key_value_iterator | constKeyValueEnd() const |
| bool | contains(const Key &key) const |
| bool | contains(const Key &key, const T &value) const |
| QMultiMap<Key, T>::size_type | count(const Key &key) const |
| QMultiMap<Key, T>::size_type | count(const Key &key, const T &value) const |
| QMultiMap<Key, T>::size_type | count() const |
| bool | empty() const |
| QMultiMap<Key, T>::iterator | end() |
| QMultiMap<Key, T>::const_iterator | end() const |
| std::pair<QMultiMap<Key, T>::iterator, QMultiMap<Key, T>::iterator> | equal_range(const Key &key) |
| std::pair<QMultiMap<Key, T>::const_iterator, QMultiMap<Key, T>::const_iterator> | equal_range(const Key &key) const |
| QMultiMap<Key, T>::iterator | erase(QMultiMap<Key, T>::const_iterator pos) |
(since 6.0) QMultiMap<Key, T>::iterator | erase(QMultiMap<Key, T>::const_iterator first, QMultiMap<Key, T>::const_iterator last) |
| QMultiMap<Key, T>::iterator | find(const Key &key) |
| QMultiMap<Key, T>::const_iterator | find(const Key &key) const |
| QMultiMap<Key, T>::const_iterator | find(const Key &key, const T &value) const |
| T & | first() |
| const T & | first() const |
| const Key & | firstKey() const |
| QMultiMap<Key, T>::iterator | insert(const Key &key, const T &value) |
| QMultiMap<Key, T>::iterator | insert(QMultiMap<Key, T>::const_iterator pos, const Key &key, const T &value) |
| bool | isEmpty() const |
| Key | key(const T &value, const Key &defaultKey = Key()) const |
| QMultiMap<Key, T>::key_iterator | keyBegin() const |
| QMultiMap<Key, T>::key_iterator | keyEnd() const |
| QMultiMap<Key, T>::key_value_iterator | keyValueBegin() |
| QMultiMap<Key, T>::const_key_value_iterator | keyValueBegin() const |
| QMultiMap<Key, T>::key_value_iterator | keyValueEnd() |
| QMultiMap<Key, T>::const_key_value_iterator | keyValueEnd() const |
| QList<Key> | keys() const |
| QList<Key> | keys(const T &value) const |
| T & | last() |
| const T & | last() const |
| const Key & | lastKey() const |
| QMultiMap<Key, T>::iterator | lowerBound(const Key &key) |
| QMultiMap<Key, T>::const_iterator | lowerBound(const Key &key) const |
| QMultiMap<Key, T>::size_type | remove(const Key &key) |
| QMultiMap<Key, T>::size_type | remove(const Key &key, const T &value) |
(since 6.1) QMultiMap<Key, T>::size_type | removeIf(Predicate pred) |
| QMultiMap<Key, T>::iterator | replace(const Key &key, const T &value) |
| QMultiMap<Key, T>::size_type | size() const |
| void | swap(QMultiMap<Key, T> &other) |
| T | take(const Key &key) |
| std::multimap<Key, T> | toStdMultiMap() const & |
| QList<Key> | uniqueKeys() const |
| QMultiMap<Key, T> & | unite(QMultiMap<Key, T> &&other) |
| QMultiMap<Key, T> & | unite(const QMultiMap<Key, T> &other) |
| QMultiMap<Key, T>::iterator | upperBound(const Key &key) |
| QMultiMap<Key, T>::const_iterator | upperBound(const Key &key) const |
| T | value(const Key &key, const T &defaultValue = T()) const |
| QList<T> | values() const |
| QList<T> | values(const Key &key) const |
| QMultiMap<Key, T> & | operator=(QMultiMap<Key, T> &&other) |
| QMultiMap<Key, T> & | operator=(const QMultiMap<Key, T> &other) |
相关的非成员
(since 6.1) qsizetype | erase_if(QMultiMap<Key, T> &map, Predicate pred) |
| bool | operator!=(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
| QMultiMap<Key, T> | operator+(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
| QMultiMap<Key, T> | operator+=(QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
(since 6.12) bool | operator<(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
| QDataStream & | operator<<(QDataStream &out, const QMultiMap<Key, T> &map) |
(since 6.12) bool | operator<=(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
(since 6.12) auto | operator<=>(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
| bool | operator==(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
(since 6.12) bool | operator>(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
(since 6.12) bool | operator>=(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs) |
| QDataStream & | operator>>(QDataStream &in, QMultiMap<Key, T> &map) |
详细说明
QMultiMap<KEY, T> 是 Qt 的泛型容器类之一,其中Key 是用于查找的键类型,T 是映射的值类型。它存储 (键, 值) 对,并支持根据键进行快速查找。
QMultiMap 和QMultiHash 提供的功能非常相似。区别在于:
- QMultiHash 其平均查找速度比 QMultiMap 更快。(详情请参阅“算法复杂度”。)
- 遍历QMultiHash 时,项的顺序是随机的。而 QMultiMap 中的项始终按键值排序。
- QMultiHash 的键类型必须提供 operator==() 以及全局的qHash(Key) 函数。QMultiMap 的键类型必须提供指定全序的 operator<()。自 Qt 5.8.1 起,即使底层 operator<() 未提供全序,使用指针类型作为键也是安全的。
以下是一个使用QString 作为键、int 作为值的 QMultiMap 示例:
要将 (键, 值) 对插入多映射中,可以使用insert():
multimap.insert("a", 1);
multimap.insert("b", 3);
multimap.insert("c", 7);
multimap.insert("c", -5);这将以下四个 (key, value) 对插入到 QMultiMap 中:("a", 1)、("b", 3)、("c", 7) 和 ("c", -5);请注意,允许键重复。
int num2 = multimap.value("a"); // 1
int num3 = multimap.value("thirteen"); // not found; 0
auto it = multimap.constFind("b");
if (it != multimap.cend()) {
num3 = it.value();
}如果映射中不存在指定键的条目,这些函数将返回一个默认构造的值。
若要检查映射中是否包含某个键,请使用 `contains()`:
int timeout = 30;
if (multimap.contains("TIMEOUT"))
timeout = multimap.value("TIMEOUT");
// better:
auto it = multimap.find("TIMEOUT");
if (it != multimap.end())
timeout = it.value();此外,value() 还有一个重载版本,当不存在指定键的项时,会将其第二个参数用作默认值:
int timeout = multimap.value("TIMEOUT", 30);若要遍历 QMultiMap 中存储的所有 (键, 值) 对,可以使用迭代器。QMultiMap 同时提供了Java 风格的迭代器(QMultiMapIterator 和QMutableMultiMapIterator )以及STL 风格的迭代器(QMultiMap::const_iterator 和QMultiMap::iterator )。 以下是使用 Java 风格迭代器遍历 QMultiMap<QString, int> 的方法:
QMultiMapIterator<QString, int> i(multimap);
while (i.hasNext()) {
i.next();
cout << qPrintable(i.key()) << ": " << i.value() << endl;
}以下是相同的代码,但这次使用了 STL 风格的迭代器:
for (auto i = multimap.cbegin(), end = multimap.cend(); i != end; ++i)
cout << qPrintable(i.key()) << ": " << i.value() << endl;项目按键值升序遍历。
QMultiMap 允许每个键拥有多个值。若调用 `insert()` 时传入的键在映射中已存在,则会插入一个新的 (键, 值) 对。例如:
multimap.insert("plenty", 100);
multimap.insert("plenty", 2000);
// multimap.size() == 2若要检索单个键的所有值,可以使用 values(const Key &key),该函数返回一个QList<T>:
QList<int> values = multimap.values("plenty");
for (auto i : std::as_const(values))
cout << i << endl;具有相同键的项按从最近插入到最早插入的顺序排列。另一种方法是调用 `find()` 获取具有该键的第一个项的 STL 风格迭代器,然后从该处开始遍历:
auto i = multimap.find("plenty");
while (i != multimap.end() && i.key() == "plenty") {
cout << i.value() << endl;
++i;
}
// better:
auto [i, end] = multimap.equal_range("plenty");
while (i != end) {
cout << i.value() << endl;
++i;
}若仅需从映射中提取值(而非键),也可使用基于范围的 for 循环:
可以通过多种方式从多映射中删除项。一种方法是调用 `remove()`;这将删除所有具有给定键的项。另一种方法是使用 `QMutableMultiMapIterator::remove()`。此外,还可以使用 `clear()` 清空整个映射。
可以通过调用unite()、使用operator+()以及使用operator+=()来合并两个多映射。示例:
QMultiMap<QString, int> map1, map2, map3;
map1.insert("plenty", 100);
map1.insert("plenty", 2000);
// map1.size() == 2
map2.insert("plenty", 5000);
// map2.size() == 1
map3 = map1 + map2;
// map3.size() == 3QMultiMap 的键和值数据类型必须是可赋值的数据类型。 这涵盖了您可能遇到的绝大多数数据类型,但编译器不会允许您将QWidget 作为值存储;相反,应存储QWidget *。此外,QMultiMap的键类型必须提供operator<()。QMap 使用该运算符来保持项的排序,并假设当x < y 和y < x 均不成立时,两个键x 和y 是相等的。
示例:
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
class Employee
{
public:
Employee() {}
Employee(const QString &name, QDate dateOfBirth);
QString name() const { return myName; }
QDate dateOfBirth() const { return myDateOfBirth; }
//...
private:
QString myName;
QDate myDateOfBirth;
};
inline bool operator<(const Employee &e1, const Employee &e2)
{
if (e1.name() != e2.name())
return e1.name() < e2.name();
return e1.dateOfBirth() < e2.dateOfBirth();
}
#endif // EMPLOYEE_H在此示例中,我们首先比较员工的姓名。如果姓名相等,则比较他们的出生日期以打破平局。
另请参阅 QMultiMapIterator 、QMutableMultiMapIterator 以及QMultiHash 。
成员类型文档
QMultiMap::ConstIterator
QMultiMap::const_iterator 的Qt风格同义词。
QMultiMap::Iterator
QMultiMap::iterator 的 Qt 风格同义词。
QMultiMap::const_key_value_iterator
typedef QMultiMap::const_key_value_iterator 为 `QMultiMap` 提供了一个 STL 风格的迭代器。
QMultiMap::const_key_value_iterator 与QMultiMap::const_iterator 本质上相同,区别在于其 operator*() 返回键值对而非单个值。
另请参阅 QKeyValueIterator 。
[alias] QMultiMap::difference_type
ptrdiff_t 的 typedef。为兼容 STL 而提供。
[alias] QMultiMap::key_type
Key 的类型别名。为兼容 STL 而提供。
QMultiMap::key_value_iterator
typedef QMultiMap::key_value_iterator 为QMultiMap 提供了一个 STL 风格的迭代器。
QMultiMap::key_value_iterator 与QMultiMap::iterator 本质上相同,区别在于其 operator*() 返回的是键/值对,而不是单个值。
另请参阅 QKeyValueIterator 。
[alias] QMultiMap::mapped_type
T 的 typedef。为确保与 STL 兼容而提供。
[alias] QMultiMap::size_type
int 的 typedef。为兼容 STL 而提供。
成员函数文档
[default] QMultiMap::QMultiMap()
构建一个空的多映射。
另请参阅 clear()。
[explicit, since 6.0] QMultiMap::QMultiMap(QMap<Key, T> &&other)
如果other 是共享的,则构建一个多映射,将其作为other 的副本。否则,通过将other 中的元素移动过来构建一个多映射。
该函数于 Qt 6.0 中引入。
[explicit, since 6.0] QMultiMap::QMultiMap(const QMap<Key, T> &other)
构建一个多映射,作为other 的副本。
该函数在 Qt 6.0 中引入。
[explicit] QMultiMap::QMultiMap(const std::multimap<Key, T> &other)
创建other 的副本。
另请参阅 toStdMultiMap()。
QMultiMap::QMultiMap(std::initializer_list<std::pair<Key, T>> list)
构建一个多映射,其中包含初始化列表list 中每个元素的副本。
[explicit] QMultiMap::QMultiMap(std::multimap<Key, T> &&other)
通过从other 开始,构建一个多映射。
另请参阅 toStdMultiMap()。
[implicit] QMultiMap::QMultiMap(const QMultiMap<Key, T> &other)
构建other 的副本。
由于 QMultiMap 是隐式共享的,因此该操作的时间复杂度为常数。这使得从函数中返回一个 QMultiMap 非常快。如果共享实例被修改,它将被复制(写时复制),而此操作的时间复杂度为线性。
另请参阅 operator=()。
[implicit] QMultiMap::QMultiMap(QMultiMap<Key, T> &&other)
通过“move”操作构造一个 QMultiMap 实例,使其指向与other 所指向的同一对象。
[implicit] QMultiMap::~QMultiMap()
销毁多映射。对多映射中值的引用以及所有遍历该多映射的迭代器都将失效。
[since 6.4] auto QMultiMap::asKeyValueRange() &&
[since 6.4] auto QMultiMap::asKeyValueRange() &
[since 6.4] auto QMultiMap::asKeyValueRange() const &&
[since 6.4] auto QMultiMap::asKeyValueRange() const &
返回一个范围对象,允许以键值对的形式遍历此多映射。例如,该范围对象可与结构化绑定声明结合使用,在基于范围的 for 循环中:
QMultiMap<QString, int> map;
map.insert("January", 1);
map.insert("February", 2);
// ...
map.insert("December", 12);
for (auto [key, value] : map.asKeyValueRange()) {
cout << qPrintable(key) << ": " << value << endl;
--value; // convert to JS month indexing
}请注意,通过此方式获取的键和值都是对多映射中相应项的引用。具体来说,修改值将直接修改多映射本身。
这些函数在 Qt 6.4 中引入。
另请参阅 QKeyValueIterator 。
QMultiMap<Key, T>::iterator QMultiMap::begin()
返回一个指向多映射中第一个项的STL 风格迭代器。
另请参阅 constBegin() 和end()。
QMultiMap<Key, T>::const_iterator QMultiMap::begin() const
这是一个重载函数。
QMultiMap<Key, T>::const_iterator QMultiMap::cbegin() const
返回一个指向多映射中第一个元素的常量STL 风格迭代器。
QMultiMap<Key, T>::const_iterator QMultiMap::cend() const
返回一个指向多映射中最后一个元素之后的“虚”元素的、STL 风格的const迭代器。
void QMultiMap::clear()
从多映射中移除所有项目。
另请参阅 remove()。
QMultiMap<Key, T>::const_iterator QMultiMap::constBegin() const
返回一个指向多映射中第一个项的 constSTL 风格迭代器。
QMultiMap<Key, T>::const_iterator QMultiMap::constEnd() const
返回一个指向多映射中最后一个元素之后的虚拟元素的常量STL 风格迭代器。
另请参阅 constBegin() 和end()。
QMultiMap<Key, T>::const_iterator QMultiMap::constFind(const Key &key) const
返回一个指向多映射中键为key 的项的const迭代器。
如果多映射中不存在键为key 的项,则该函数返回constEnd()。
另请参见 find() 和QMultiMap::constFind(const Key &key, const T &value)。
QMultiMap<Key, T>::const_iterator QMultiMap::constFind(const Key &key, const T &value) const
返回一个迭代器,该迭代器指向映射中键为key 、值为value 的项。
如果映射中不存在该项,则该函数返回constEnd()。
另请参阅 QMap::constFind()。
QMultiMap<Key, T>::const_key_value_iterator QMultiMap::constKeyValueBegin() const
返回一个指向多映射中第一个条目的常量STL 风格迭代器。
另请参阅 keyValueBegin()。
QMultiMap<Key, T>::const_key_value_iterator QMultiMap::constKeyValueEnd() const
返回一个指向多映射中最后一个条目之后虚构条目的、STL 风格的const迭代器。
另请参阅 constKeyValueBegin()。
bool QMultiMap::contains(const Key &key) const
如果多映射中包含键为key 的条目,则返回true ;否则返回false 。
另请参阅 count()。
bool QMultiMap::contains(const Key &key, const T &value) const
如果多映射中包含键为key 、值为value 的条目,则返回true ;否则返回false 。
另请参阅 count()。
QMultiMap<Key, T>::size_type QMultiMap::count(const Key &key) const
返回与键key 关联的项的数量。
另请参阅 contains() 和QMultiMap::count(const Key &key, const T &value)。
QMultiMap<Key, T>::size_type QMultiMap::count(const Key &key, const T &value) const
返回具有键key 和值value 的项的数量。
另请参阅 contains() 和QMultiMap::count()。
QMultiMap<Key, T>::size_type QMultiMap::count() const
与size()相同。
这是一个重载函数。
bool QMultiMap::empty() const
提供此函数是为了兼容 STL。它等同于 `isEmpty()`,如果映射为空,则返回 true;否则返回 false。
QMultiMap<Key, T>::iterator QMultiMap::end()
返回一个STL 风格的迭代器,该迭代器指向多映射中最后一个元素之后的虚拟元素。
QMultiMap<Key, T>::const_iterator QMultiMap::end() const
这是一个重载函数。
std::pair<QMultiMap<Key, T>::iterator, QMultiMap<Key, T>::iterator> QMultiMap::equal_range(const Key &key)
返回一对迭代器,它们界定了值范围[first, second) ,这些值存储在key 中。
std::pair<QMultiMap<Key, T>::const_iterator, QMultiMap<Key, T>::const_iterator> QMultiMap::equal_range(const Key &key) const
这是一个重载函数。
QMultiMap<Key, T>::iterator QMultiMap::erase(QMultiMap<Key, T>::const_iterator pos)
从多映射中移除由迭代器pos 所指向的 (键, 值) 对,并返回指向该映射中下一个元素的迭代器。
注意: 迭代器pos 必须有效且可解引用。
另请参阅 remove()。
[since 6.0] QMultiMap<Key, T>::iterator QMultiMap::erase(QMultiMap<Key, T>::const_iterator first, QMultiMap<Key, T>::const_iterator last)
从多映射中移除由迭代器范围 [first,last) 所指向的 (键, 值) 对。返回一个迭代器,该迭代器指向多映射中紧随最后一个被移除元素之后的项。
注意: 范围[first, last) 必须是 *this 中的有效范围。
该函数在 Qt 6.0 中引入。
另请参阅 remove()。
QMultiMap<Key, T>::iterator QMultiMap::find(const Key &key)
返回一个迭代器,该迭代器指向多映射中键为key 的项。
如果多映射中不存在键为key 的项,则该函数返回end()。
如果多映射中包含多个键为key 的项,则该函数返回一个指向最近插入的值的迭代器。通过递增迭代器可以访问其他值。例如,以下代码演示了如何遍历所有具有相同键的项:
auto i = multimap.find("plenty");
while (i != multimap.end() && i.key() == "plenty") {
cout << i.value() << endl;
++i;
}
// better:
auto [i, end] = multimap.equal_range("plenty");
while (i != end) {
cout << i.value() << endl;
++i;
}另请参阅 constFind()、value()、values()、lowerBound() 以及upperBound()。
QMultiMap<Key, T>::const_iterator QMultiMap::find(const Key &key) const
这是一个重载函数。
QMultiMap<Key, T>::const_iterator QMultiMap::find(const Key &key, const T &value) const
返回一个常量迭代器,该迭代器指向映射中具有给定key 和value 的项。
如果映射中不存在此类项,则该函数返回 `end()`。
如果映射中包含多个具有指定key 的项,则该函数返回一个指向最近插入的值的 const 迭代器。
这是一个重载函数。
T &QMultiMap::first()
返回多映射中第一个值的引用,即映射到最小键的值。该函数假设多映射不为空。
当未共享(或调用 const 版本)时,此函数的执行时间为常数时间。
另请参阅 last()、firstKey() 和isEmpty()。
const T &QMultiMap::first() const
这是一个重载函数。
const Key &QMultiMap::firstKey() const
返回多映射中最小键的引用。该函数假设多映射不为空。
该函数的执行时间为常数时间。
另请参阅 lastKey()、first()、keyBegin() 以及isEmpty()。
QMultiMap<Key, T>::iterator QMultiMap::insert(const Key &key, const T &value)
插入一个新条目,其键为key ,值为value 。
如果映射中已经存在键为replace 的项,该函数将直接创建一个新的项。(此行为与 ()不同,后者会覆盖现有项的值。)
QMultiMap 允许重复键,并按键值升序存储项目。对于重复键,其值将按反向插入顺序存储(最近插入的值排在最前面)。
返回一个指向新元素的迭代器。
另请参阅 replace()。
QMultiMap<Key, T>::iterator QMultiMap::insert(QMultiMap<Key, T>::const_iterator pos, const Key &key, const T &value)
插入一个新项,其键为key ,值为value ,并带有提示pos ,用于指定插入的位置。
如果使用constBegin() 作为提示,则表示key 小于多映射中的任何键;而constEnd() 则表示key 严格大于多映射中的任何键。 否则,该提示应满足条件 (pos - 1)。key() <key <= pos。key()。如果提示pos 错误,则会被忽略,并执行常规插入操作。
如果提示正确且多映射处于未共享状态,则插入操作将在摊销常数时间内完成。
如果映射中已经存在具有相同键的项,该函数将直接创建一个新的项。
当从已排序的数据创建多映射时,使用constBegin() 先插入最大的键比使用constEnd() 按排序顺序插入更快,因为constEnd() - 1(用于检查提示是否有效)需要对数时间。
返回一个指向新元素的迭代器。
注意:使用提示时需谨慎。提供来自较旧共享实例的迭代器可能会导致程序崩溃,但也存在悄无声息地同时破坏多映射和pos 多映射的风险。
这是一个重载函数。
bool QMultiMap::isEmpty() const
如果多映射中不包含任何项,则返回 `true `;否则返回 `false`。
另请参阅 size()。
Key QMultiMap::key(const T &value, const Key &defaultKey = Key()) const
返回第一个值为value 的键;如果多映射中不存在值为value 的项,则返回defaultKey 。如果未提供defaultKey ,该函数将返回一个默认构造的键。
此函数可能运行较慢(线性时间),因为QMultiMap 的内部数据结构是为按键快速查找而优化的,而非按值查找。
QMultiMap<Key, T>::key_iterator QMultiMap::keyBegin() const
返回一个指向多映射中第一个键的常量STL 风格迭代器。
QMultiMap<Key, T>::key_iterator QMultiMap::keyEnd() const
返回一个指向多映射中最后一个键之后那个“虚构”项的常量STL 风格迭代器。
QMultiMap<Key, T>::key_value_iterator QMultiMap::keyValueBegin()
返回一个指向多映射中第一个条目的STL 风格迭代器。
另请参阅 keyValueEnd()。
QMultiMap<Key, T>::const_key_value_iterator QMultiMap::keyValueBegin() const
返回一个指向多映射中第一个条目的常量STL 风格迭代器。
另请参阅 ` keyValueEnd()`。
QMultiMap<Key, T>::key_value_iterator QMultiMap::keyValueEnd()
返回一个STL 风格的迭代器,该迭代器指向多映射中最后一个条目之后的虚构条目。
另请参阅 keyValueBegin()。
QMultiMap<Key, T>::const_key_value_iterator QMultiMap::keyValueEnd() const
返回一个指向多映射中最后一个条目之后的虚拟条目的、STL 风格的const迭代器。
另请参阅 keyValueBegin()。
QList<Key> QMultiMap::keys() const
返回一个列表,其中包含多映射中所有键,并按升序排列。如果在多映射中某个键出现多次,则该键在列表中也会出现多次。
该排序顺序保证与values()所使用的排序顺序一致。
该函数以线性时间复杂度创建一个新列表。通过将keyBegin() 转换为keyEnd() 进行迭代,可以避免由此产生的时间和内存开销。
QList<Key> QMultiMap::keys(const T &value) const
返回一个列表,其中包含与值value 关联的所有键,按升序排列。
该函数可能运行较慢(线性时间),因为QMultiMap 的内部数据结构是为按键快速查找而优化的,而非按值查找。
这是一个重载函数。
T &QMultiMap::last()
返回多映射中最后一个值的引用,即映射到最大键的值。该函数假设该映射不为空。
当未共享(或调用 const 版本)时,该函数的执行时间为常数时间。
另请参阅 first()、lastKey() 和isEmpty()。
const T &QMultiMap::last() const
这是一个重载函数。
const Key &QMultiMap::lastKey() const
返回多映射中最大键的引用。该函数假设多映射不为空。
该函数的执行时间为常数时间。
另请参阅 firstKey()、last()、keyEnd() 以及isEmpty()。
QMultiMap<Key, T>::iterator QMultiMap::lowerBound(const Key &key)
返回一个迭代器,该迭代器指向映射中键为key 的第一个项。如果映射中不存在键为key 的项,则该函数返回一个迭代器,该迭代器指向键值最大且最接近的项。
示例:
QMultiMap<int, QString> multimap;
multimap.insert(1, "one");
multimap.insert(5, "five");
multimap.insert(5, "five (2)");
multimap.insert(10, "ten");
multimap.lowerBound(0); // returns iterator to (1, "one")
multimap.lowerBound(1); // returns iterator to (1, "one")
multimap.lowerBound(2); // returns iterator to (5, "five")
multimap.lowerBound(5); // returns iterator to (5, "five")
multimap.lowerBound(6); // returns iterator to (10, "ten")
multimap.lowerBound(10); // returns iterator to (10, "ten")
multimap.lowerBound(999); // returns end()如果映射中包含多个键为key 的项,则该函数返回一个指向最近插入的值的迭代器。通过递增迭代器,可以访问其他值。例如,以下代码用于遍历所有具有相同键的项:
QMap<QString, int> multimap;
//...
QMap<QString, int>::const_iterator i = multimap.lowerBound("HDR");
QMap<QString, int>::const_iterator upperBound = multimap.upperBound("HDR");
while (i != upperBound) {
cout << i.value() << endl;
++i;
}另请参阅 upperBound() 和find()。
QMultiMap<Key, T>::const_iterator QMultiMap::lowerBound(const Key &key) const
这是一个重载函数。
QMultiMap<Key, T>::size_type QMultiMap::remove(const Key &key)
从多映射中移除所有具有键key 的项目。返回移除的项目数量。
QMultiMap<Key, T>::size_type QMultiMap::remove(const Key &key, const T &value)
从多映射中移除所有键为key 、值为value 的项。返回移除的项的数量。
[since 6.1] template <typename Predicate> QMultiMap<Key, T>::size_type QMultiMap::removeIf(Predicate pred)
从多映射中移除所有满足谓词pred 返回 true 的元素。
该函数支持接受QMultiMap<Key, T>::iterator 类型参数或std::pair<const Key &, T &> 类型参数的谓词。
返回被移除的元素数量(如有)。
该函数于 Qt 6.1 中引入。
QMultiMap<Key, T>::iterator QMultiMap::replace(const Key &key, const T &value)
插入一个新条目,其键为key ,值为value 。
如果已经存在键为key 的条目,则该条目的值将被替换为value 。
如果存在多个键为key 的项,则最近插入的项的值将被替换为value 。
返回一个指向新元素或更新后元素的迭代器。
另请参阅 insert()。
QMultiMap<Key, T>::size_type QMultiMap::size() const
返回多映射中 (键, 值) 对的数量。
[noexcept] void QMultiMap::swap(QMultiMap<Key, T> &other)
将此多映射与other 互换。此操作速度极快,且从不失败。
T QMultiMap::take(const Key &key)
从多元素映射中移除键为key 的项,并返回与其关联的值。
如果该项在多映射中不存在,则该函数仅返回一个默认构造的值。如果映射中存在多个key 项,则仅移除并返回最近插入的那一项。
若不使用返回值,则使用remove() 更为高效。
另请参阅 remove()。
std::multimap<Key, T> QMultiMap::toStdMultiMap() const &
返回一个与该链接QMultiMap 等效的 STL 多映射。
QList<Key> QMultiMap::uniqueKeys() const
返回一个列表,其中包含映射中所有按升序排列的键。如果某个键在映射中出现多次,则在返回的列表中仅出现一次。
QMultiMap<Key, T> &QMultiMap::unite(QMultiMap<Key, T> &&other)
将other 映射中的所有项移动到此映射中。如果两个映射中存在相同的键,则生成的映射中将包含该键多次。
如果other 是共享的,则会将项进行复制。
QMultiMap<Key, T> &QMultiMap::unite(const QMultiMap<Key, T> &other)
将other 映射中的所有项插入到此映射中。如果两个映射中存在共同的键,则生成的映射中该键会多次出现。
QMultiMap<Key, T>::iterator QMultiMap::upperBound(const Key &key)
返回一个迭代器,该迭代器指向映射中键为key 的最后一个项之后的下一个项。如果映射中不存在键为key 的项,则该函数返回一个迭代器,指向键值最大且最接近的项。
示例:
QMultiMap<int, QString> multimap;
multimap.insert(1, "one");
multimap.insert(5, "five");
multimap.insert(5, "five (2)");
multimap.insert(10, "ten");
multimap.upperBound(0); // returns iterator to (1, "one")
multimap.upperBound(1); // returns iterator to (5, "five")
multimap.upperBound(2); // returns iterator to (5, "five")
multimap.lowerBound(5); // returns iterator to (5, "five (2)")
multimap.lowerBound(6); // returns iterator to (10, "ten")
multimap.upperBound(10); // returns end()
multimap.upperBound(999); // returns end()另请参阅 lowerBound() 和find()。
QMultiMap<Key, T>::const_iterator QMultiMap::upperBound(const Key &key) const
这是一个重载函数。
T QMultiMap::value(const Key &key, const T &defaultValue = T()) const
返回与键key 关联的值。
如果多值映射中不存在键为key 的项,则该函数返回defaultValue 。如果未指定defaultValue ,则该函数返回一个默认构造的值。如果多值映射中存在多个key 的项,则返回最近插入的那一个的值。
另请参阅 key()、values() 和contains()。
QList<T> QMultiMap::values() const
返回一个列表,其中包含映射中的所有值,按键的升序排列。如果一个键关联了多个值,则该键的所有值都会包含在列表中,而不仅仅是最近插入的那个。
QList<T> QMultiMap::values(const Key &key) const
返回一个列表,其中包含与键key 关联的所有值,按从最新插入到最旧插入的顺序排列。
[implicit] QMultiMap<Key, T> &QMultiMap::operator=(QMultiMap<Key, T> &&other)
将other 通过move赋值给此QMultiMap 实例。
[implicit] QMultiMap<Key, T> &QMultiMap::operator=(const QMultiMap<Key, T> &other)
将other 赋值给此多映射,并返回对此多映射的引用。
相关的非成员
[since 6.1] template <
typename Key,
typename T,
typename Predicate
>
qsizetype erase_if(QMultiMap<Key, T> &map, Predicate pred)
从多映射map 中移除所有满足谓词pred 的元素。
该函数支持接受类型为QMultiMap<Key, T>::iterator 或std::pair<const Key &, T &> 的谓词。
返回被移除的元素数量(如有)。
该函数在 Qt 6.1 中引入。
bool operator!=(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
如果 `lhs ` 不等于 `rhs`,则返回 `true `;否则返回 `false`。
如果两个多映射包含相同的 (键, 值) 对,且顺序相同(对于重复键而言,顺序很重要),则认为它们相等。
该函数要求键和值的类型实现operator==() 。
另请参阅 operator==()。
template <typename Key, typename T> QMultiMap<Key, T> operator+(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
返回一个映射,其中包含lhs 映射中的所有项,以及rhs 中的所有项。如果某个键在两个映射中都存在,则生成的映射中将包含该键多次。
另请参阅 operator+=()。
template <typename Key, typename T> QMultiMap<Key, T> operator+=(QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
将rhs 映射中的所有项目插入到lhs 映射中,并返回生成的映射。
[since 6.12] bool operator<(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
如果lhs 的字典序小于 rhs ,则返回true ;否则返回false 。
如果键类型Key 和映射类型T 都提供了operator<=>() (在 C++20 模式下)、compareThreeWay() 辅助方法或operator<() 中的任意一种,则此运算符可用。
该函数在 Qt 6.12 中引入。
template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QMultiMap<Key, T> &map)
将多映射map 写入流out 。
此函数要求键和值的类型都实现operator<<() 接口。
另请参阅 QDataStream 运算符的格式。
[since 6.12] bool operator<=(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
如果 `lhs `在字典序上小于或等于 ` rhs`,则返回 `true `;否则返回 `false`。
如果键类型Key 和映射类型T 都提供了operator<=>() (在 C++20 模式下)、compareThreeWay() 辅助方法或operator<() 中的任意一种,则该运算符可用。
该函数在 Qt 6.12 中引入。
[since 6.12] auto operator<=>(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
按字典序比较lhs 和rhs 的内容。返回最强的适用类别类型的结果。
注意: 仅当键类型Key 和映射类型T 均满足std::three_way_comparable 概念的要求,或提供operator<() 时,此 运算符才在 C++20 模式下可用。在此情况下,< 、<= 、> 和>= 运算符将由operator<=>() 和operator==() 合成。
该函数首次出现在 Qt 6.12 中。
bool operator==(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
如果 `lhs ` 等于 `rhs`,则返回 `true `;否则返回 `false`。
如果两个多映射包含相同的 (键, 值) 对,且顺序相同(对于重复键而言,顺序很重要),则认为它们相等。
此函数要求键和值的类型都实现了operator==() 接口。
另请参阅 operator!=()。
[since 6.12] bool operator>(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
如果lhs 在字典序上大于 rhs ,则返回true ;否则返回false 。
如果键类型Key 和映射类型T 都提供了operator<=>() (在 C++20 模式下)、compareThreeWay() 辅助方法或operator<() 中的任意一种,则该运算符可用。
该函数于 Qt 6.12 中引入。
[since 6.12] bool operator>=(const QMultiMap<Key, T> &lhs, const QMultiMap<Key, T> &rhs)
如果lhs 在字典序上大于或等于 rhs,则返回true ;否则返回false 。
如果键类型Key 和映射类型T 均提供了operator<=>() (在 C++20 模式下)、compareThreeWay() 辅助方法或operator<() 中的任意一种,则该运算符可用。
该函数在 Qt 6.12 中引入。
template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QMultiMap<Key, T> &map)
将流in 中的映射读取到map 中。
此函数要求键和值的类型都实现operator>>() 接口。
另请参阅 QDataStream 运算符的格式。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.