QMultiHash Class

template <typename Key, typename T> class QMultiHash

QMultiHash 类提供了一个多值散列表。更多

头文件: #include <QMultiHash>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

该类可等价比较

注意:该类中的所有函数都是可重入的

公共类型

公共函数

QMultiHash()
QMultiHash(const QHash<Key, T> &other)
QMultiHash(std::initializer_list<std::pair<Key, T>> list)
QMultiHash(InputIterator begin, InputIterator end)
(since 6.4) auto asKeyValueRange() &&
(since 6.4) auto asKeyValueRange() &
(since 6.4) auto asKeyValueRange() const &&
(since 6.4) auto asKeyValueRange() const &
QMultiHash<Key, T>::iterator begin()
QMultiHash<Key, T>::const_iterator begin() const
QMultiHash<Key, T>::const_iterator cbegin() const
QMultiHash<Key, T>::const_iterator cend() const
void clear()
QMultiHash<Key, T>::const_iterator constBegin() const
QMultiHash<Key, T>::const_iterator constEnd() const
QMultiHash<Key, T>::const_iterator constFind(const Key &key, const T &value) const
QMultiHash<Key, T>::const_key_value_iterator constKeyValueBegin() const
QMultiHash<Key, T>::const_key_value_iterator constKeyValueEnd() const
bool contains(const Key &key, const T &value) const
qsizetype count(const Key &key, const T &value) const
QMultiHash<Key, T>::iterator emplace(Key &&key, Args &&... args)
QMultiHash<Key, T>::iterator emplace(const Key &key, Args &&... args)
QMultiHash<Key, T>::iterator emplaceReplace(Key &&key, Args &&... args)
QMultiHash<Key, T>::iterator emplaceReplace(const Key &key, Args &&... args)
QMultiHash<Key, T>::iterator end()
QMultiHash<Key, T>::const_iterator end() const
std::pair<QMultiHash<Key, T>::iterator, QMultiHash<Key, T>::iterator> equal_range(const Key &key)
std::pair<QMultiHash<Key, T>::const_iterator, QMultiHash<Key, T>::const_iterator> equal_range(const Key &key) const
QMultiHash<Key, T>::iterator find(const Key &key, const T &value)
QMultiHash<Key, T>::const_iterator find(const Key &key, const T &value) const
QMultiHash<Key, T>::iterator insert(const Key &key, const T &value)
Key key(const T &value) const
Key key(const T &value, const Key &defaultKey) const
QMultiHash<Key, T>::key_iterator keyBegin() const
QMultiHash<Key, T>::key_iterator keyEnd() const
QMultiHash<Key, T>::key_value_iterator keyValueBegin()
QMultiHash<Key, T>::const_key_value_iterator keyValueBegin() const
QMultiHash<Key, T>::key_value_iterator keyValueEnd()
QMultiHash<Key, T>::const_key_value_iterator keyValueEnd() const
QList<Key> keys() const
qsizetype remove(const Key &key)
qsizetype remove(const Key &key, const T &value)
(since 6.1) qsizetype removeIf(Predicate pred)
QMultiHash<Key, T>::iterator replace(const Key &key, const T &value)
void swap(QMultiHash<Key, T> &other)
T take(const Key &key)
QList<Key> uniqueKeys() const
(since 6.0) QMultiHash<Key, T> &unite(const QHash<Key, T> &other)
QMultiHash<Key, T> &unite(const QMultiHash<Key, T> &other)
T value(const Key &key) const
T value(const Key &key, const T &defaultValue) const
QList<T> values() const
QList<T> values(const Key &key) const
QMultiHash<Key, T> operator+(const QMultiHash<Key, T> &other) const
QMultiHash<Key, T> &operator+=(const QMultiHash<Key, T> &other)
T &operator[](const Key &key)
(since 6.1) qsizetype erase_if(QMultiHash<Key, T> &hash, Predicate pred)
size_t qHash(const QMultiHash<Key, T> &key, size_t seed = 0)
bool operator!=(const QMultiHash<Key, T> &lhs, const QMultiHash<Key, T> &rhs)
QDataStream &operator<<(QDataStream &out, const QMultiHash<Key, T> &hash)
bool operator==(const QMultiHash<Key, T> &lhs, const QMultiHash<Key, T> &rhs)
QDataStream &operator>>(QDataStream &in, QMultiHash<Key, T> &hash)

详细说明

QMultiHash<Key, T> 是 Qt 的通用容器类之一。它提供了一个允许同一键有多个值的哈希表。

QMultiHash 在很大程度上反映了QHash 的 API。例如,您可以使用isEmpty() 测试哈希是否为空,还可以使用QHash 的迭代器类遍历 QMultiHash(例如,QHashIterator )。但与QHash 不同的是,它提供了一个insert() 函数,允许插入具有相同键的多个项目。replace() 函数与QHash::insert() 相对应。它还提供了方便的 operator+() 和 operator+=()。

QMultiMap 不同,QMultiHash 不提供插入项的排序。唯一能保证的是,共享相同键值的项目将从最近插入的值到最近插入的值连续出现。

举例说明:

QMultiHash<QString, int> hash1, hash2, hash3;

hash1.insert("plenty", 100);
hash1.insert("plenty", 2000);
// hash1.size() == 2

hash2.insert("plenty", 5000);
// hash2.size() == 1

hash3 = hash1 + hash2;
// hash3.size() == 3

QHash 不同,QMultiHash 不提供操作符[]。如果要访问具有特定键的最近插入项,请使用value() 或replace() 。

如果要检索单个键的所有值,可以使用 values(const Key &key) 返回QList<T>:

QList<int> values = hash.values("plenty");
for (auto i : std::as_const(values))
    cout << i << endl;

共享相同键的项目从最近插入到最近不插入。

更有效的方法是调用find() 来获取具有键的第一个项的 STL 风格迭代器,然后从这里开始迭代:

auto i = hash.constFind("plenty");
while (i != hash.cend() && i.key() == "plenty") {
    cout << i.value() << endl;
    ++i;
}

QMultiHash 的键和值数据类型必须是可分配的数据类型。例如,不能将QWidget 作为值存储;而应存储QWidget *。此外,QMultiHash 的键类型必须提供 operator==(),并且在该类型的命名空间中还必须有一个qHash() 函数,用于返回键类型参数的哈希值。详情请参见QHash 文档。

另请参见 QHash,QHashIterator,QMutableHashIteratorQMultiMap

成员类型文档

QMultiHash::const_key_value_iterator

QMultiHash::const_key_value_iterator 类型定义为QMultiHash 提供了 STL 风格的常量迭代器。

QMultiHash::const_key_value_iterator 与QMultiHash::const_iterator 基本相同,不同之处在于 operator*() 返回的是键/值对而不是值。

另请参见 QKeyValueIterator

QMultiHash::key_value_iterator

QMultiHash::key_value_iterator 类型定义为QMultiHash 提供了 STL 风格的迭代器。

QMultiHash::key_value_iterator 与QMultiHash::iterator 基本相同,不同之处在于 operator*() 返回的是键/值对而不是值。

另请参见 QKeyValueIterator

成员函数文档

template <typename... Args> QMultiHash<Key, T>::iterator QMultiHash::emplace(Key &&key, Args &&... args)

template <typename... Args> QMultiHash<Key, T>::iterator QMultiHash::emplace(const Key &key, Args &&... args)

向容器中插入一个新元素。新元素是使用args 作为参数就地创建的。

如果哈希值中已经存在具有相同键值的项目,该函数将直接创建一个新的项目。(这种行为与replace() 不同,后者会覆盖现有项目的值)。

返回指向新元素的迭代器。

警告: 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 insert

template <typename... Args> QMultiHash<Key, T>::iterator QMultiHash::emplaceReplace(Key &&key, Args &&... args)

template <typename... Args> QMultiHash<Key, T>::iterator QMultiHash::emplaceReplace(const Key &key, Args &&... args)

向容器中插入一个新元素。新元素是使用args 作为参数就地构建的。

如果哈希值中已经有一个具有相同键值的项目,则该项目值将被替换为由args 构建的值。

返回指向新元素的迭代器。

警告: 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 replaceemplace

[noexcept] T QMultiHash::value(const Key &key) const

[noexcept] T QMultiHash::value(const Key &key, const T &defaultValue) const

返回与key 相关联的值。

如果散列中没有与key 相关的项,函数将返回defaultValue ,如果未提供该参数,则返回默认构造值

如果散列中有多个与key 相关的项目,则返回最近插入的项目的值。

[noexcept] Key QMultiHash::key(const T &value) const

[noexcept] Key QMultiHash::key(const T &value, const Key &defaultKey) const

返回映射到value 的第一个键。如果散列中没有映射到value 的项,则返回defaultKey ,如果没有提供该参数,则返回默认构建的键

该函数可能比较慢(线性时间),因为QMultiHash 的内部数据结构经过优化,可按键而不是按值快速查找。

[since 6.4] auto QMultiHash::asKeyValueRange() &

[since 6.4] auto QMultiHash::asKeyValueRange() &&

[since 6.4] auto QMultiHash::asKeyValueRange() const &

[since 6.4] auto QMultiHash::asKeyValueRange() const &&

返回一个范围对象,允许以键/值对的形式迭代哈希值。例如,结合结构化绑定声明,该范围对象可用于基于范围的 for 循环:

QMultiHash<QString, int> hash;
hash.insert("January", 1);
hash.insert("February", 2);
// ...
hash.insert("December", 12);

for (auto [key, value] : hash.asKeyValueRange()) {
    cout << qPrintable(key) << ": " << value << endl;
    --value; // convert to JS month indexing
}

请注意,这样获得的键和值都是对哈希值的引用。具体来说,更改值将会修改哈希值本身。

警告 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。

此函数在 Qt 6.4 中引入。

另请参阅 QKeyValueIterator

[noexcept] QMultiHash::QMultiHash()

构造一个空散列。

[explicit] QMultiHash::QMultiHash(const QHash<Key, T> &other)

构建other 的副本(可以是QHash 或 QMultiHash)。

QMultiHash::QMultiHash(std::initializer_list<std::pair<Key, T>> list)

用初始化列表list 中每个元素的副本构建多哈希值。

template <typename InputIterator> QMultiHash::QMultiHash(InputIterator begin, InputIterator end)

构造一个多哈希值,其中包含迭代器范围 [begin,end) 中每个元素的副本。由范围迭代的元素必须是具有firstsecond 数据成员(如std::pair )的对象,可分别转换为KeyT ;或者迭代器必须具有key()value() 成员函数,可分别返回可转换为Key 的键和可转换为T 的值。

QMultiHash<Key, T>::iterator QMultiHash::begin()

返回一个STL 样式的迭代器,指向散列中的第一个项目。

警告 下次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 constBegin() 和end()。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::begin() const

这是一个重载函数。

警告 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::cbegin() const

返回指向散列中第一个项目的STL 样式迭代器

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 begin() 和cend()。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::cend() const

返回一个STL 样式的常量迭代器,指向哈希值中最后一个项目之后的假想项目。

警告 下次在散列上调用非常量函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 cbegin() 和end()。

[noexcept(...)] void QMultiHash::clear()

删除哈希值中的所有项目并释放所有内存。

注: std::is_nothrow_destructible<Node>::valuetrue 时,此函数为 noexcept。

另请参阅 remove() 。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::constBegin() const

返回指向散列中第一个项目的STL 样式迭代器

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 begin() 和constEnd()。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::constEnd() const

返回一个STL 样式的常量迭代器,指向哈希值中最后一个项目之后的假想项目。

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 constBegin() 和end()。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::constFind(const Key &key, const T &value) const

返回一个迭代器,指向散列中具有keyvalue 的项目。

如果散列中没有这样的项目,函数将返回constEnd().

警告: 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。

[noexcept] QMultiHash<Key, T>::const_key_value_iterator QMultiHash::constKeyValueBegin() const

返回指向散列中第一个条目的STL 样式迭代器

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 keyValueBegin().

[noexcept] QMultiHash<Key, T>::const_key_value_iterator QMultiHash::constKeyValueEnd() const

返回一个STL 样式的常量迭代器,指向散列中最后一个条目之后的虚条目。

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 constKeyValueBegin().

[noexcept] bool QMultiHash::contains(const Key &key, const T &value) const

如果哈希值包含keyvalue ,则返回true ;否则返回false

另请参阅 contains()。

[noexcept] qsizetype QMultiHash::count(const Key &key, const T &value) const

返回keyvalue 的条目的数量。

另请参阅 count()。

[noexcept] QMultiHash<Key, T>::iterator QMultiHash::end()

返回一个STL 样式的迭代器,指向散列中最后一个项目之后的假想项目。

警告 下次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 begin() 和constEnd()。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::end() const

这是一个重载函数。

std::pair<QMultiHash<Key, T>::iterator, QMultiHash<Key, T>::iterator> QMultiHash::equal_range(const Key &key)

返回一对迭代器,它们限定了存储在key 下的[first, second) 的值范围。如果范围为空,则两个迭代器都等于end()。

警告: 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

[noexcept] std::pair<QMultiHash<Key, T>::const_iterator, QMultiHash<Key, T>::const_iterator> QMultiHash::equal_range(const Key &key) const

这是一个重载函数。

警告 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。

QMultiHash<Key, T>::iterator QMultiHash::find(const Key &key, const T &value)

返回指向带有keyvalue 的项目的迭代器。如果散列中不包含此类项目,函数将返回end()。

如果散列中包含多个keyvalue 的项目,则返回的迭代器指向最近插入的项目。

警告: 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。

[noexcept] QMultiHash<Key, T>::const_iterator QMultiHash::find(const Key &key, const T &value) const

这是一个重载函数。

警告 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。

QMultiHash<Key, T>::iterator QMultiHash::insert(const Key &key, const T &value)

插入一个新项目,其keyvalue 的值。

如果哈希值中已经存在具有相同键值的项目,该函数将直接创建一个新项目。(这种行为与replace() 不同,后者会覆盖现有项的值。)

返回指向新元素的迭代器。

警告: 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 replace().

[noexcept] QMultiHash<Key, T>::key_iterator QMultiHash::keyBegin() const

返回指向散列中第一个键的STL 样式迭代器

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 keyEnd().

[noexcept] QMultiHash<Key, T>::key_iterator QMultiHash::keyEnd() const

返回一个常量STL 样式的迭代器,指向散列中最后一个键之后的假想项。

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参见 keyBegin().

[noexcept] QMultiHash<Key, T>::key_value_iterator QMultiHash::keyValueBegin()

返回一个STL 样式的迭代器,指向散列中的第一个条目。

警告 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 keyValueEnd().

[noexcept] QMultiHash<Key, T>::const_key_value_iterator QMultiHash::keyValueBegin() const

返回指向散列中第一个条目的STL 样式迭代器

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 keyValueEnd().

[noexcept] QMultiHash<Key, T>::key_value_iterator QMultiHash::keyValueEnd()

返回一个STL 样式的迭代器,指向散列中最后一个条目之后的虚条目。

警告 下次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参见 keyValueBegin().

[noexcept] QMultiHash<Key, T>::const_key_value_iterator QMultiHash::keyValueEnd() const

返回一个STL 样式的常量迭代器,指向散列中最后一个条目之后的虚条目。

警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参见 keyValueBegin().

QList<Key> QMultiHash::keys() const

按任意顺序返回一个包含散列中所有键值的列表。在散列中出现多次的键也会在列表中出现多次。

顺序保证与values() 使用的顺序相同。

该函数以线性时间创建一个新列表。通过从keyBegin() 到keyEnd() 的迭代,可以避免由此产生的时间和内存占用。

另请参见 values() 和key()。

qsizetype QMultiHash::remove(const Key &key)

删除哈希值中key 的所有项目。返回删除的项目数。

另请参阅 remove()。

qsizetype QMultiHash::remove(const Key &key, const T &value)

删除哈希值keyvalue 的所有项目。返回删除的项目数。

另请参见 remove().

[since 6.1] template <typename Predicate> qsizetype QMultiHash::removeIf(Predicate pred)

从多散列中删除谓词pred 返回 true 的所有元素。

该函数支持使用QMultiHash<Key, T>::iterator 类型参数或std::pair<const Key &, T &> 类型参数的谓词。

如果有,则返回已删除元素的数量。

此函数在 Qt 6.1 中引入。

另请参阅 clear() 和take()。

QMultiHash<Key, T>::iterator QMultiHash::replace(const Key &key, const T &value)

插入一个新项目,其key 和值为value

如果已有项目的key ,则该项目值将被替换为value

如果有多个项目的key ,则最近插入的项目的值将被替换为value

返回指向新/更新元素的迭代器。

警告: 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 insert().

[noexcept] void QMultiHash::swap(QMultiHash<Key, T> &other)

将多哈希值与other 互换。这一操作速度非常快,而且从未出现过故障。

T QMultiHash::take(const Key &key)

从散列表中删除key 的项目,并返回与之相关的值。

如果该项目不存在于散列中,函数会简单地返回一个默认构造值。如果散列中有多个key 的项目,则只删除最近插入的项目。

如果不使用返回值,remove() 的效率更高。

另请参见 remove()。

QList<Key> QMultiHash::uniqueKeys() const

返回一个包含映射表中所有键的列表。在映射中出现多次的键在返回的列表中只出现一次。

另请参阅 keys() 和values()。

[since 6.0] QMultiHash<Key, T> &QMultiHash::unite(const QHash<Key, T> &other)

other hash 中的所有项目插入此 hash,并返回此 hash 的引用。

此函数在 Qt 6.0 中引入。

另请参阅 insert()。

QMultiHash<Key, T> &QMultiHash::unite(const QMultiHash<Key, T> &other)

other hash 中的所有项目插入此 hash,并返回此 hash 的引用。

另请参阅 insert().

QList<T> QMultiHash::values() const

按任意顺序返回一个包含哈希值中所有值的列表。如果一个键与多个值相关联,那么它的所有值都将出现在列表中,而不仅仅是最近插入的一个。

顺序保证与keys() 使用的顺序相同。

该函数以线性时间创建一个新列表。通过从keyValueBegin() 到keyValueEnd() 的迭代,可以避免由此产生的时间和内存占用。

另请参见 keys() 和value()。

QList<T> QMultiHash::values(const Key &key) const

这是一个重载函数。

返回与key 相关的所有值的列表,从最近插入的值到最少插入的值。

另请参阅 count() 和insert()。

QMultiHash<Key, T> QMultiHash::operator+(const QMultiHash<Key, T> &other) const

返回一个哈希值,其中除了包含other 中的所有项目外,还包含此哈希值中的所有项目。如果两个哈希值中的某个键是共用的,则生成的哈希值将多次包含该键。

另请参阅 operator+=().

QMultiHash<Key, T> &QMultiHash::operator+=(const QMultiHash<Key, T> &other)

other hash 中的所有项目插入此 hash,并返回此 hash 的引用。

另请参阅 unite() 和insert()。

T &QMultiHash::operator[](const Key &key)

以可修改引用的形式返回与key 相关联的值。

如果散列中没有包含key 的项目,函数会在散列中插入一个默认构建的值 key ,并返回该值的引用。

如果散列中包含多个与key 对应的项目,该函数将返回最近插入值的引用。

警告: 下一次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。

另请参阅 insert() 和value()。

相关非成员

[since 6.1] template <typename Key, typename T, typename Predicate> qsizetype erase_if(QMultiHash<Key, T> &hash, Predicate pred)

从多散列hash 中删除谓词pred 返回 true 的所有元素。

该函数支持使用QMultiHash<Key, T>::iterator 类型参数或std::pair<const Key &, T &> 类型参数的谓词。

如果有,则返回移除元素的数量。

此函数在 Qt 6.1 中引入。

[noexcept(...)] template <typename Key, typename T> size_t qHash(const QMultiHash<Key, T> &key, size_t seed = 0)

返回key 的哈希值,使用seed 作为计算的种子。

qHash() 必须支持KeyT 类型。

注: noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>()))true 时,此函数为 noexcept。

[noexcept] bool operator!=(const QMultiHash<Key, T> &lhs, const QMultiHash<Key, T> &rhs)

如果lhs 多哈希值不等于rhs 多哈希值,则返回true ;否则返回false

如果两个多哈希值包含相同的(键、值)对,则视为相等。

此函数要求值类型实现operator==()

另请参见 operator==()。

template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QMultiHash<Key, T> &hash)

将散列hash 写入流out

该函数要求键和值类型实现operator<<()

另请参阅 序列化 Qt 数据类型

[noexcept] bool operator==(const QMultiHash<Key, T> &lhs, const QMultiHash<Key, T> &rhs)

如果lhs 多哈希值等于rhs 多哈希值,则返回true ;否则返回false

如果两个多哈希值包含相同的(键、值)对,则视为相等。

此函数要求值类型实现operator==()

另请参见 operator!=()。

template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QMultiHash<Key, T> &hash)

将哈希值从in 流读入hash

该函数要求键和值类型实现operator>>()

另请参阅 序列化 Qt 数据类型

© 2025 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.