QMultiHash类
template <typename Key, typename T> class QMultiHashQMultiHash类是一个提供多值散列的便利QHash子类,详情请见更多...
头文件 | #include <QMultiHash> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 所有成员列表,包括继承的成员
- QMultiHash是隐式共享类的一部分。
注意:此类中所有函数都是可重入的。
公共类型
公共函数
QMultiHash() | |
QMultiHash(std::initializer_list<std::pair<Key, T>> list) | |
QMultiHash(InputIterator begin, InputIterator end) | |
QMultiHash(const QHash<Key, T> &other) | |
(自6.4以来) auto | asKeyValueRange() & |
(自6.4以来) auto | asKeyValueRange() const & |
(自6.4以来) auto | asKeyValueRange() && |
(自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(const Key &key, Args &&... args) |
QMultiHash<Key, T>::iterator | emplace(Key &&key, Args &&... args) |
QMultiHash<Key, T>::iterator | emplaceReplace(const Key &key, Args &&... args) |
QMultiHash<Key, T>::iterator | emplaceReplace(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 | 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 | keyBegin() const |
QMultiHash | keyEnd() const |
QMultiHash | keyValueBegin() |
QMultiHash<Key, T>::const_key_value_iterator | keyValueBegin() const |
QMultiHash | keyValueEnd() |
QMultiHash<Key, T>::const_key_value_iterator | keyValueEnd() const |
QList | 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 |
T | take(const Key &key) |
QList | uniqueKeys() const |
QMultiHash | unite(const QMultiHash |
(since 6.0) QMultiHash | unite(const QHash |
T | value(const Key &key) const |
T | value(const Key &key, const T &defaultValue) const |
QList | values() const |
QList | values(const Key &key) const |
QMultiHash | operator+(const QMultiHash |
QMultiHash | operator+=(const QMultiHash |
T & | operator[](const Key &key) |
相关非成员
(since 6.1) qsizetype | erase_if(QMultiHash |
size_t | qHash(const QMultiHash |
QDataStream & | operator<<(QDataStream &out, const QMultiHash |
QDataStream & | operator>>(QDataStream &in, QMultiHash |
详细描述
QMultiHash
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 文档。
另请参阅 QHash、QHashIterator、QMutableHashIterator 和 QMultiMap。
成员类型文档
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函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。
[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) 中每个元素副本的多重哈希表。该范围所迭代的元素必须是具有 first
和 second
数据成员的对象(如 std::pair
),可转换为 Key
和 T
分别;或者迭代器必须具有 key()
和 value()
成员函数,分别返回可转换为 Key
和 T
的键和值。
[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函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。
[noexcept]
QMultiHash<Key, T>::const_iterator QMultiHash::cend() const
返回一个指向哈希簿中最后一个项目的后面的虚构项目的 const STL-style iterator。
警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。
[noexcept(...)]
void QMultiHash::clear()
从哈希表中删除所有项并释放它占用的所有内存。
注意:当 "std::is_nothrow_destructible
另请参阅:remove()。
[noexcept]
QMultiHash<Key, T>::const_iterator QMultiHash::constBegin() const
返回一个指向哈希簿中第一个项目的 const STL-style iterator。
警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。
[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
返回一个迭代器,指向哈希表中具有指定 key 和 value 的项。
如果哈希表中不存在这样的项,该函数返回 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
如果哈希表包含具有指定 key 和 value 的项,则返回 true
;否则返回 false
。
另请参阅:contains()。
[noexcept]
qsizetype QMultiHash::count(const Key &key, const T &value) const
返回具有指定 key 和 value 的项的数量。
另请参阅:count()。
[noexcept]
QMultiHash<Key, T>::iterator QMultiHash::end()
返回一个指向哈希表中最后一个项之后的假想项的 STL-style 迭代器。
警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。
[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)
返回一个指向具有key和value的项的迭代器。如果哈希中不存在这样的项,则该函数返回end()。
如果哈希中存在多个具有key和value的项,则返回的迭代器指向的是最近插入的项。
警告:下次您在对哈希调用一个非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() 迭代来避免在这种情况下涉及的有关时间和内存的使用。
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>::iterator
或 std::pair<const Key &, T &>
的谓词。
如果有任何元素被移除,则返回被移除的元素数量。
此函数在 Qt 6.1 中引入。
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
返回一个包含哈希中所有键的列表。哈希表中多次出现的键在返回的列表中只出现一次。
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() 来避免所属的时间和内存使用。
QList<T> QMultiHash::values(const Key &key) const
这是一个重载函数。
返回与 key 关联的所有值的列表,从最近插入的到最后插入的一个。
QMultiHash<Key, T> QMultiHash::operator+(const QMultiHash<Key, T> &other) const
返回一个包含此哈希中所有项以及其他所有项的哈希。如果两个哈希共享同一个键,则结果哈希将包含该键多次。
另请参阅 operator+=().
QMultiHash<Key, T> &QMultiHash::operator+=(const QMultiHash<Key, T> &other)
将 other 哈希中的所有项插入到此哈希中,并返回对此哈希的引用。
T &QMultiHash::operator[](const Key &key)
返回与 key 关联的值,作为可修改的引用。
如果哈希中不存在 key 的项,则函数将在哈希中插入一个带有 key 的 默认构造的值,并返回对该值的引用。
如果哈希中存在多个 key 的项,则此函数将返回最近插入的值的引用。
警告:下次您在对哈希调用一个非const函数或在哈希被销毁时,返回的迭代器/引用应被视为无效。
相关非成员
[since 6.1]
模板 <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(...)]
模板 <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公司注册商标。所有其他商标属于其各自的所有者。