QMultiHash类

template <typename Key, typename T> class QMultiHash

QMultiHash类是一个提供多值散列的便利QHash子类,详情请见更多...

头文件 #include <QMultiHash>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

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

公共类型

公共函数

QMultiHash()
QMultiHash(std::initializer_list<std::pair<Key, T>> list)
QMultiHash(InputIterator begin, InputIterator end)
QMultiHash(const QHash<Key, T> &other)
(自6.4以来) autoasKeyValueRange() &
(自6.4以来) autoasKeyValueRange() const &
(自6.4以来) autoasKeyValueRange() &&
(自6.4以来) autoasKeyValueRange() const &&
QMultiHash<Key, T>::iteratorbegin()
QMultiHash<Key, T>::const_iteratorbegin() const
QMultiHash<Key, T>::const_iteratorcbegin() const
QMultiHash<Key, T>::const_iteratorcend() const
voidclear()
QMultiHash<Key, T>::const_iteratorconstBegin() const
QMultiHash<Key, T>::const_iteratorconstEnd() const
QMultiHash<Key, T>::const_iteratorconstFind(const Key &key, const T &value) const
QMultiHash<Key, T>::const_key_value_iteratorconstKeyValueBegin() const
QMultiHash<Key, T>::const_key_value_iteratorconstKeyValueEnd() const
boolcontains(const Key &key, const T &value) const
qsizetypecount(const Key &key, const T &value) const
QMultiHash<Key, T>::iteratoremplace(const Key &key, Args &&... args)
QMultiHash<Key, T>::iteratoremplace(Key &&key, Args &&... args)
QMultiHash<Key, T>::iteratoremplaceReplace(const Key &key, Args &&... args)
QMultiHash<Key, T>::iteratoremplaceReplace(Key &&key, Args &&... args)
QMultiHash<Key, T>::iteratorend()
QMultiHash<Key, T>::const_iteratorend() const
std::pair<QMultiHash<Key, T>::iterator, QMultiHash<Key, T>::iterator>equal_range(const Key &key)
std::pair::const_iterator, QMultiHash::const_iterator>equal_range(const Key &key) const
QMultiHash<Key, T>::iteratorfind(const Key &key, const T &value)
QMultiHash<Key, T>::const_iteratorfind(const Key &key, const T &value) const
QMultiHash<Key, T>::iteratorinsert(const Key &key, const T &value)
Keykey(const T &value) const
Keykey(const T &value, const Key &defaultKey) const
QMultiHash::key_iteratorkeyBegin() const
QMultiHash::key_iteratorkeyEnd() const
QMultiHash::key_value_iteratorkeyValueBegin()
QMultiHash<Key, T>::const_key_value_iteratorkeyValueBegin() const
QMultiHash::key_value_iteratorkeyValueEnd()
QMultiHash<Key, T>::const_key_value_iteratorkeyValueEnd() const
QListkeys() const
qsizetyperemove(const Key &key)
qsizetyperemove(const Key &key, const T &value)
(since 6.1) qsizetyperemoveIf(Predicate pred)
QMultiHash<Key, T>::iteratorreplace(const Key &key, const T &value)
voidswap(QMultiHash &other)
Ttake(const Key &key)
QListuniqueKeys() const
QMultiHash &unite(const QMultiHash &other)
(since 6.0) QMultiHash &unite(const QHash &other)
Tvalue(const Key &key) const
Tvalue(const Key &key, const T &defaultValue) const
QListvalues() const
QListvalues(const Key &key) const
QMultiHashoperator+(const QMultiHash &other) const
QMultiHash &operator+=(const QMultiHash &other)
T &operator[](const Key &key)
(since 6.1) qsizetypeerase_if(QMultiHash &hash, Predicate pred)
size_tqHash(const QMultiHash &key, size_t seed = 0)
QDataStream &operator<<(QDataStream &out, const QMultiHash &hash)
QDataStream &operator>>(QDataStream &in, QMultiHash &hash)

详细描述

QMultiHash 是 Qt 的通用 容器类 之一。它继承自 QHash 并扩展了一些方便的函数,使其比 QHash 更适合存储多值哈希。多值哈希是一种允许具有相同键的多个值的哈希。

QMultiHash 主要反映 QHash 的 API。例如,您可以使用 isEmpty() 检查哈希是否为空,并使用 QHash 的迭代器类(例如,QHashIterator)遍历 QMultiHash。但是,与 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 不提供 operator[]。如果您想访问具有某键的最近插入项,请使用 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 文档。

另请参阅 QHashQHashIteratorQMutableHashIteratorQMultiMap

成员类型文档

QMultiHash::const_key_value_iterator

QMap::const_key_value_iterator 类型定义提供了一个 STL 样式的 const 迭代器,用于 QMultiHash

QMultiHash::const_key_value_iterator 与 QMultiHash::const_iterator 几乎相同,区别在于 operator*() 返回键/值对而不是值。

另请参阅 QKeyValueIterator

QMultiHash::key_value_iterator

QMap::key_value_iterator 类型定义提供了一个 STL 样式的迭代器,用于 QMultiHash

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()不同,后者会覆盖现有项目的值。)

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

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅 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 的新值替换。

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

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅 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()

构建一个空的哈希表。

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

构造一个具有初始化列表中每个元素副本的多重哈希表。

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

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

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

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

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

返回一个指向哈希簿中第一个项目的 STL-style iterator

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅constBegin() 和 end

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

这是一个重载函数。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

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

返回一个指向哈希簿中第一个项目的 const STL-style iterator

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅begin() 和 cend

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

返回一个指向哈希簿中最后一个项目的后面的虚构项目的 const STL-style iterator

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅cbegin() 和 end

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

从哈希表中删除所有项并释放它占用的所有内存。

注意:当 "std::is_nothrow_destructible::value" 为 true 时,此函数不会抛出任何异常。

另请参阅:remove()。

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

返回一个指向哈希簿中第一个项目的 const STL-style iterator

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

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

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

返回一个指向哈希簿中最后一个项目的后面的虚构项目的 const STL-style iterator

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅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

返回一个指向哈希表中第一个条目的 const STL-style 迭代器。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅:keyValueBegin()。

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

返回一个指向哈希表中最后一个条目之后的假想条目的 const STL-style 迭代器。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅: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-style 迭代器。

警告:下次您在对哈希调用一个非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()。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

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

这是一个重载函数。

警告:下次您在对哈希调用一个非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

这是一个重载函数。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

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

插入具有key和一个值为value的新项。

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

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

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅replace()。

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

返回一个指向哈希中第一个键的常量STL-style iterator。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅keyEnd()。

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

返回一个指向哈希中最后一个键之后的一个虚构项的常量STL-style iterator。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅keyBegin()。

[无异常] QMultiHash<Key, T>::key_value_iterator QMultiHash::keyValueBegin()

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

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅keyValueEnd

[无异常] QMultiHash<Key, T>::const_key_value_iterator QMultiHash::keyValueBegin() const

返回一个指向哈希表中第一个条目的 const STL-style 迭代器。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅keyValueEnd

[无异常] QMultiHash<Key, T>::key_value_iterator QMultiHash::keyValueEnd()

返回一个指向哈希中最后一项之后虚构条目的 STL样式迭代器

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅:keyValueBegin()。

[无异常] QMultiHash<Key, T>::const_key_value_iterator QMultiHash::keyValueEnd() const

返回一个指向哈希表中最后一个条目之后的假想条目的 const STL-style 迭代器。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅: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)

从哈希中移除所有具有指定 key 且值 value 的项。返回被移除的项目数量。

另请参阅:remove()。

[自6.1起] 模板 <typename Predicate> qsizetype QMultiHash::removeIf(Predicate pred)

从多哈希中移除所有使谓词 pred 返回 true 的元素。

该函数支持接受类型为 QMultiHash<Key, T>::iteratorstd::pair<const Key &, T &> 的谓词。

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

此函数在 Qt 6.1 中引入。

另请参阅clear() 和 take

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

插入具有key和一个值为value的新项。

如果已经存在具有 的项,那么该项的值将被 替换。

如果存在多个具有 的项,则将最近插入的项的值替换为

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

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

另请参阅 insert

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

交换哈希 other 与此哈希。此操作非常快且从不失败。

T QMultiHash::take(const Key &key)

从哈希中删除具有 的项并返回与其关联的值。

如果该项不在哈希中,函数则简单地返回一个 默认构造的值。如果哈希中为 包含多个项,则只移除最近插入的一项。

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

另请参阅:remove()。

QList<Key> QMultiHash::uniqueKeys() const

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

另请参阅 keys() 和 values

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

other 哈希中的所有项插入到此哈希中,并返回对此哈希的引用。

另请参阅 insert

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

other 哈希中的所有项插入到此哈希中,并返回对此哈希的引用。

该函数从 Qt 6.0 开始引入。

另请参阅 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

返回一个包含此哈希中所有项以及其他所有项的哈希。如果两个哈希共享同一个键,则结果哈希将包含该键多次。

另请参阅 operator+=().

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

other 哈希中的所有项插入到此哈希中,并返回对此哈希的引用。

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

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

返回与 key 关联的值,作为可修改的引用。

如果哈希中不存在 key 的项,则函数将在哈希中插入一个带有 key默认构造的值,并返回对该值的引用。

如果哈希中存在多个 key 的项,则此函数将返回最近插入的值的引用。

警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。

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

相关非成员

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

从多哈希 hash 中移除所有使谓词 pred 返回 true 的元素。

该函数支持接受类型为 QMultiHash<Key, T>::iteratorstd::pair<const Key &, T &> 的谓词。

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

此函数在 Qt 6.1 中引入。

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

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

类型 T 必须受 qHash() 支持。

注意:当 "noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>()))" 为真时,此函数不会抛出异常。

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

将哈希 hash 写入流 out

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

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

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

从流 in 中读取哈希到 hash 中。

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

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

© 2024 Qt公司有限公司。本文档的贡献者保留了其各自的权利。本提供的文档遵循自由软件基金会发布的 GNU自由文档许可版本1.3 的条款。Qt及其相关标志是芬兰和/或其他国家的Q公司注册商标。所有其他商标属于其各自的所有者。