QHash Class
template <typename Key, typename T> class QHashQHash 类是一个模板类,可提供基于哈希表的字典。更多
头文件: | #include <QHash> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 所有成员(包括继承成员)的列表
- 已废弃成员
- QHash 属于隐式共享类。
该类可等价比较。
注意:该类中的所有函数都是可重入的。
公共类型
(since 6.9) struct | TryEmplaceResult |
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 |
公共函数
QHash() | |
QHash(std::initializer_list<std::pair<Key, T>> list) | |
QHash(InputIterator begin, InputIterator end) | |
QHash(const QHash<Key, T> &other) | |
QHash(QHash<Key, T> &&other) | |
~QHash() | |
(since 6.4) auto | asKeyValueRange() && |
(since 6.4) auto | asKeyValueRange() & |
(since 6.4) auto | asKeyValueRange() const && |
(since 6.4) auto | asKeyValueRange() const & |
QHash<Key, T>::iterator | begin() |
QHash<Key, T>::const_iterator | begin() const |
qsizetype | capacity() const |
QHash<Key, T>::const_iterator | cbegin() const |
QHash<Key, T>::const_iterator | cend() const |
void | clear() |
QHash<Key, T>::const_iterator | constBegin() const |
QHash<Key, T>::const_iterator | constEnd() const |
QHash<Key, T>::const_iterator | constFind(const Key &key) const |
QHash<Key, T>::const_key_value_iterator | constKeyValueBegin() const |
QHash<Key, T>::const_key_value_iterator | constKeyValueEnd() const |
bool | contains(const Key &key) const |
qsizetype | count(const Key &key) const |
qsizetype | count() const |
QHash<Key, T>::iterator | emplace(Key &&key, Args &&... args) |
QHash<Key, T>::iterator | emplace(const Key &key, Args &&... args) |
bool | empty() const |
QHash<Key, T>::iterator | end() |
QHash<Key, T>::const_iterator | end() const |
QHash<Key, T>::iterator | erase(QHash<Key, T>::const_iterator pos) |
QHash<Key, T>::iterator | find(const Key &key) |
QHash<Key, T>::const_iterator | find(const Key &key) const |
void | insert(const QHash<Key, T> &other) |
QHash<Key, T>::iterator | insert(const Key &key, const T &value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | insertOrAssign(K &&key, Value &&value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | insertOrAssign(Key &&key, Value &&value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | insertOrAssign(const Key &key, Value &&value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | insert_or_assign(K &&key, Value &&value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | insert_or_assign(Key &&key, Value &&value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | insert_or_assign(const Key &key, Value &&value) |
(since 6.9) QHash<Key, T>::key_value_iterator | insert_or_assign(QHash<Key, T>::const_iterator hint, K &&key, Value &&value) |
(since 6.9) QHash<Key, T>::key_value_iterator | insert_or_assign(QHash<Key, T>::const_iterator hint, Key &&key, Value &&value) |
(since 6.9) QHash<Key, T>::key_value_iterator | insert_or_assign(QHash<Key, T>::const_iterator hint, const Key &key, Value &&value) |
bool | isEmpty() const |
Key | key(const T &value) const |
Key | key(const T &value, const Key &defaultKey) const |
QHash<Key, T>::key_iterator | keyBegin() const |
QHash<Key, T>::key_iterator | keyEnd() const |
QHash<Key, T>::key_value_iterator | keyValueBegin() |
QHash<Key, T>::const_key_value_iterator | keyValueBegin() const |
QHash<Key, T>::key_value_iterator | keyValueEnd() |
QHash<Key, T>::const_key_value_iterator | keyValueEnd() const |
QList<Key> | keys() const |
QList<Key> | keys(const T &value) const |
float | load_factor() const |
bool | remove(const Key &key) |
(since 6.1) qsizetype | removeIf(Predicate pred) |
void | reserve(qsizetype size) |
qsizetype | size() const |
void | squeeze() |
void | swap(QHash<Key, T> &other) |
T | take(const Key &key) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryEmplace(K &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryEmplace(Key &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryEmplace(const Key &key, Args &&... args) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryInsert(K &&key, const T &value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryInsert(const Key &key, const T &value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | try_emplace(K &&key, Args &&... args) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | try_emplace(Key &&key, Args &&... args) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | try_emplace(const Key &key, Args &&... args) |
(since 6.9) QHash<Key, T>::key_value_iterator | try_emplace(QHash<Key, T>::const_iterator hint, K &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::key_value_iterator | try_emplace(QHash<Key, T>::const_iterator hint, Key &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::key_value_iterator | try_emplace(QHash<Key, T>::const_iterator hint, const Key &key, Args &&... args) |
T | value(const Key &key) const |
T | value(const Key &key, const T &defaultValue) const |
QList<T> | values() const |
QHash<Key, T> & | operator=(QHash<Key, T> &&other) |
QHash<Key, T> & | operator=(const QHash<Key, T> &other) |
T & | operator[](const Key &key) |
const T | operator[](const Key &key) const |
相关非成员
(since 6.1) qsizetype | erase_if(QHash<Key, T>&hash, Predicatepred) |
(since 6.5) size_t | qHash(Enumkey, size_tseed= 0) |
size_t | qHash(const QMqttTopicFilter&filter, size_tseed) |
size_t | qHash(QSslEllipticCurvekey, size_tseed) |
size_t | qHash(QDatekey, size_tseed= 0) |
size_t | qHash(const QStringRef&key, size_tseed) |
size_t | qHash(const QMqttTopicName&name, size_tseed) |
size_t | qHash(const QOcspResponse&key, size_tseed) |
size_t | qHash(const QGeoCoordinate&coordinate, size_tseed) |
size_t | qHash(ulongkey, size_tseed= 0) |
size_t | qHash(短键,size_tseed= 0) |
(since 6.0) size_t | qHash(wchar_tkey, size_tseed= 0) |
size_t | qHash(QLatin1StringViewkey, size_tseed= 0) |
size_t | qHash(const QSslCertificate&key, size_tseed) |
(since 6.0) size_t | qHash(QPointkey, size_tseed= 0) |
size_t | qHash(const QSslError&key, size_tseed) |
size_t | qHash(QTimekey, size_tseed= 0) |
(since 6.9) size_t | qHash(Tkey, size_tseed) |
size_t | qHash(charkey, size_tseed= 0) |
(since 6.0) size_t | qHash(char16_tkey, size_tseed= 0) |
(since 6.0) size_t | qHash(char32_tkey, size_tseed= 0) |
(since 6.0) size_t | qHash(char8_tkey, size_tseed= 0) |
size_t | qHash(const QBitArray&key, size_tseed= 0) |
size_t | qHash(const QByteArray&key, size_tseed= 0) |
size_t | qHash(const QCharkey, size_tseed= 0) |
size_t | qHash(const QDateTime&key, size_tseed= 0) |
size_t | qHash(const QHash<Key, T>&key, size_tseed= 0) |
size_t | qHash(const QSet<T>&key, size_tseed= 0) |
size_t | qHash(const QString&key, size_tseed= 0) |
(since 6.0) size_t | qHash(const QTypeRevision&key, size_tseed= 0) |
size_t | qHash(const QUrl&key, size_tseed= 0) |
size_t | qHash(const QVersionNumber&key, size_tseed= 0) |
size_t | qHash(const T*key, size_tseed= 0) |
size_t | qHash(const std::pair<T1, T2>&key, size_tseed= 0) |
size_t | qHash(doublekey, size_tseed= 0) |
size_t | qHash(floatkey, size_tseed= 0) |
size_t | qHash(intkey, size_tseed= 0) |
size_t | qHash(长键,size_tseed= 0) |
size_t | qHash(长双键,size_tseed= 0) |
(since 6.8) size_t | qHash(qint128key, size_tseed= 0) |
size_t | qHash(qint64key, size_tseed= 0) |
(since 6.8) size_t | qHash(quint128key, size_tseed= 0) |
size_t | qHash(quint64key, size_tseed= 0) |
size_t | qHash(短key、size_tseed= 0)。 |
size_t | qHash(有符号 charkey、size_tseed= 0)。 |
(since 6.0) size_t | qHash(std::nullptr_tkey, size_tseed= 0) |
size_t | qHash(ucharkey, size_tseed= 0) |
size_t | qHash(uintkey, size_tseed= 0) |
size_t | qHashBits(const void*p, size_tlen, size_tseed= 0) |
(since 6.0) size_t | qHashMulti(size_tseed, const T &...args) |
(since 6.0) size_t | qHashMultiCommutative(size_tseed, const T &...args) |
size_t | qHashRange(InputIteratorfirst, InputIteratorlast, size_tseed= 0) |
size_t | qHashRangeCommutative(第一个输入迭代器,最后一个输入迭代器,size_tseed= 0) |
bool | operator!=(const QHash<Key, T>&lhs, const QHash<Key, T>&rhs) |
QDataStream & | operator<<(QDataStream&out, const QHash<Key, T>&hash) |
bool | operator==(const QHash<Key, T>&lhs, const QHash<Key, T>&rhs) |
QDataStream & | operator>>(QDataStream&in, QHash<Key, T>&hash) |
详细说明
QHash<Key, T> 是 Qt 的通用容器类之一。它存储(键、值)对,并提供与键相关的值的快速查找。
QHash 提供的功能与QMap 非常相似。不同之处在于
- QHash 的查找速度比QMap 更快(详情请参见算法复杂性)。
- 对QMap 进行迭代时,项目总是按键排序。而使用 QHash 时,项目可以任意排序。
- QMap 的键类型必须提供 operator<()。QHash 的键类型必须提供 operator==() 和名为qHash() 的全局哈希函数(参见qHash )。
下面是一个 QHash 示例,其键为QString ,值为int
:
要在哈希值中插入(键、值)对,可以使用 operator[]():
hash["one"] = 1; hash["three"] = 3; hash["seven"] = 7;
这会在 QHash 中插入以下三个(键、值)对:("1", 1)、("3", 3)和("7", 7)。另一种向哈希值中插入项目的方法是使用insert() :
hash.insert("twelve", 12);
要查找值,请使用 operator[]() 或 value():
int num1 = hash["thirteen"]; int num2 = hash.value("thirteen");
如果散列中没有指定键的项目,这些函数会返回一个默认构造的值。
如果要检查散列中是否包含某个键,请使用contains() :
int timeout = 30; if (hash.contains("TIMEOUT")) timeout = hash.value("TIMEOUT");
还有一个 value() 重载,如果没有指定键的项目,它就会使用第二个参数作为默认值:
int timeout = hash.value("TIMEOUT", 30);
一般来说,我们建议您使用contains() 和 value() 而不是 operator[]() 来查找散列中的键。因为如果不存在具有相同键值的项目,operator[]() 会默默地在散列中插入一个项目(除非散列是常量)。例如,以下代码段将在内存中创建 1000 个项:
// WRONG QHash<int, QWidget *> hash; ... for (int i = 0; i < 1000; ++i) { if (hash[i] == okButton) cout << "Found button at index " << i << endl; }
要避免这个问题,请将上面代码中的hash[i]
替换为hash.value(i)
。
在内部,QHash 使用哈希表来执行查找。这个哈希表会自动增长,以便在不浪费太多内存的情况下提供快速查找。如果您已经知道 QHash 大概包含多少项,还可以通过调用reserve() 来控制哈希表的大小,但这并不是获得良好性能的必要条件。您还可以调用capacity() 来获取哈希表的大小。
如果从表中删除项目,QHash 不会自动缩小。要尽量减少哈希表占用的内存,请调用squeeze() 。
如果想浏览存储在 QHash 中的所有(键、值)对,可以使用迭代器。QHash 提供Java 风格的迭代器(QHashIterator 和QMutableHashIterator )和STL 风格的迭代器(QHash::const_iterator 和QHash::iterator )。下面是如何使用 Java 风格迭代器遍历 QHash<QString, int>:
QHashIterator<QString, int> i(hash); while (i.hasNext()) { i.next(); cout << qPrintable(i.key()) << ": " << i.value() << endl; }
下面是相同的代码,但使用的是 STL 风格迭代器:
for (auto i = hash.cbegin(), end = hash.cend(); i != end; ++i) cout << qPrintable(i.key()) << ": " << i.value() << endl;
QHash 是无序的,因此不能假定迭代器的序列是可预测的。如果需要按键排序,请使用QMap 。
QHash 每个键只允许一个值。如果调用insert() 时使用的键已经存在于 QHash 中,那么之前的值就会被删除。例如
hash.insert("plenty", 100); hash.insert("plenty", 2000); // hash.value("plenty") == 2000
如果需要在哈希表中为同一个键存储多个条目,请使用QMultiHash 。
如果只需从哈希表中提取值(而不是键),也可以使用基于范围的方法:
有几种方法可以从散列表中删除项目。一种方法是调用remove() ;这将删除任何具有给定键的项。另一种方法是使用QMutableHashIterator::remove() 。此外,还可以使用clear() 清除整个哈希值。
QHash 的键和值数据类型必须是可分配的数据类型。例如,不能将QWidget 作为值存储;而应存储QWidget *。
散列函数
QHash 的键类型除了是可分配的数据类型外,还有其他要求:它必须提供 operator==(),还必须有一个散列函数,为键类型的参数返回一个散列值。
散列函数根据密钥计算数值。它可以使用任何可以想象到的算法,只要在给定相同参数的情况下总是返回相同的值即可。换句话说,如果e1 == e2
,那么hash(e1) == hash(e2)
也必须成立。不过,为了获得良好的性能,散列函数应尽量为不同的键返回不同的散列值。
密钥类型K
的散列函数可以通过两种不同的方式提供。
第一种方法是在K
的命名空间中重载qHash()
。qHash()
函数必须具有以下签名之一:
size_tqHash(K key,size_t seed);size_t qHash(const K &key, size_t seed); size_t qHash(K key); // deprecated, do not use size_t qHash(const K &key); // deprecated, do not use
双参数重载使用一个无符号整数,该整数应被用来作为散列函数计算的种子。该种子由 QHash 提供,以防止出现algorithmic complexity attacks 系列。
注意: 在 Qt 6 中,可以定义一个仅使用一个参数的qHash()
重载;但对该重载的支持已被弃用。从 Qt 7 开始,必须使用双参数重载。如果一个键类型同时定义了单参数和双参数重载,QHash 将使用后者(请注意,您可以简单地定义一个双参数版本,并为种子参数使用默认值)。
提供散列函数的第二种方法是为密钥类型特化std::hash
类K
,并为其提供合适的函数调用操作符:
namespace std { template <> struct hash<K> { // seed is optional size_t operator()(const K &key, size_t seed = 0) const; }; }
种子参数的含义与qHash()
相同,可以不使用。
第二种方法允许在 QHash 和 C++ 标准库无序关联容器之间重复使用相同的散列函数。如果一个类型同时提供了qHash()
重载和std::hash
特殊化,那么qHash()
重载更受青睐。
以下是可作为 QHash 中键的 C++ 和 Qt XML 类型的部分列表:任何整数类型(char、无符号 long 等)、任何指针类型、QChar 、QString 和QByteArray 。对于所有这些类型,<QHash>
头定义了一个qHash() 函数,用于计算适当的哈希值。许多其他 Qt 类也为它们的类型声明了qHash 重载;请参阅每个类的文档。
如果想使用其他类型作为键,请确保提供 operator==() 和哈希值实现。
方便的qHashMulti() 函数可用于实现自定义类型的qHash(),在这种情况下,通常需要从多个字段生成哈希值:
示例
#ifndef EMPLOYEE_H #define EMPLOYEE_H class Employee { public: Employee() {} Employee(const QString &name, QDate dateOfBirth); ... private: QString myName; QDate myDateOfBirth; }; inline bool operator==(const Employee &e1, const Employee &e2) { return e1.name() == e2.name() && e1.dateOfBirth() == e2.dateOfBirth(); } inline size_t qHash(const Employee &key, size_t seed) { return qHashMulti(seed, key.name(), key.dateOfBirth()); } #endif // EMPLOYEE_H
在上面的示例中,我们依靠 Qt XML 自己实现的qHash() 为QString 和QDate 分别提供了雇员姓名和出生日期的哈希值。
请注意,Qt 提供的qHash() 重载的实现可能会随时改变。在不同的 Qt XML 版本中,您不能依赖qHash() 会给出相同的结果(对于相同的输入)。
算法复杂性攻击
所有哈希表都容易受到一类特殊的拒绝服务攻击,在这类攻击中,攻击者会精心预先计算出一组不同的键,这些键将在哈希表的同一个桶中进行哈希(甚至具有相同的哈希值)。这种攻击的目的是在数据输入哈希表时获得最坏情况下的算法行为(O(n),而不是摊销后的 O(1),详情请参见算法复杂性)。
为了避免这种最坏情况,qHash() 计算哈希值时可以使用随机种子进行加盐,这样就能消除攻击的影响。QHash 会在每个进程中自动生成一次随机种子,然后将其作为qHash() 函数双参数重载的第二个参数传递给 QHash。
QHash 的这种随机化默认是启用的。尽管程序绝不应依赖于特定的 QHash 排序,但在某些情况下,例如调试或回归测试,您可能会暂时需要确定性的行为。要禁用随机化,可将环境变量QT_HASH_SEED
定义为 0。或者,也可以调用QHashSeed::setDeterministicGlobalSeed() 函数。
另请参阅 QHashIterator,QMutableHashIterator,QMap 和QSet 。
成员类型文档
QHash::ConstIterator
QHash::const_iterator 的 Qt-style 同义词。
QHash::Iterator
QHash::iterator 的 Qt-style 同义词。
QHash::const_key_value_iterator
QHash::const_key_value_iterator 类型定义为QHash 提供了 STL 风格的常量迭代器。
QHash::const_key_value_iterator 与QHash::const_iterator 基本相同,不同之处在于 operator*() 返回的是键/值对而不是值。
另请参见 QKeyValueIterator 。
[alias]
QHash::difference_type
ptrdiff_t 的类型定义。为与 STL 兼容而提供。
[alias]
QHash::key_type
键的类型定义。为与 STL 兼容而提供。
QHash::key_value_iterator
QHash::key_value_iterator 类型定义为QHash 提供了 STL 风格的迭代器。
QHash::key_value_iterator 与QHash::iterator 基本相同,不同之处在于 operator*() 返回的是键/值对而不是值。
另请参见 QKeyValueIterator 。
[alias]
QHash::mapped_type
为 T 提供的类型定义,与 STL 兼容。
[alias]
QHash::size_type
int 的类型定义。为与 STL 兼容而提供。
成员函数文档
[noexcept]
T QHash::value(const Key &key) const
[noexcept]
T QHash::value(const Key &key, const T &defaultValue) const
这是一个重载函数。
返回与key 相关联的值。
如果哈希值中不包含key 的项,则函数返回defaultValue ,如果未提供此参数,则返回默认构造值。
[noexcept]
Key QHash::key(const T &value) const
[noexcept]
Key QHash::key(const T &value, const Key &defaultKey) const
返回映射到value 的第一个键。如果散列中没有映射到value 的项,则返回defaultKey ,如果没有提供该参数,则返回默认构建的键。
该函数可能会比较慢(线性时间),因为QHash 的内部数据结构经过优化,可按键而不是按值快速查找。
[since 6.4]
auto QHash::asKeyValueRange() &
[since 6.4]
auto QHash::asKeyValueRange() &&
[since 6.4]
auto QHash::asKeyValueRange() const &
[since 6.4]
auto QHash::asKeyValueRange() const &&
返回一个范围对象,允许以键/值对的形式迭代哈希值。例如,结合结构化绑定声明,该范围对象可用于基于范围的 for 循环:
QHash<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 。
template <typename... Args> QHash<Key, T>::iterator QHash::emplace(Key &&key, Args &&... args)
template <typename... Args> QHash<Key, T>::iterator QHash::emplace(const Key &key, Args &&... args)
向容器中插入一个新元素。新元素是使用args 作为参数就地构建的。
返回指向新元素的迭代器。
警告: 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。
[since 6.9]
template <typename K, typename... Args, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(K &&key, Args &&... args)
[since 6.9]
template <typename... Args> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(Key &&key, Args &&... args)
[since 6.9]
template <typename... Args> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(const Key &key, Args &&... args)
插入一个带有key 和由args 构建的值的新项目。如果带有key 的项目已经存在,则不会插入。
返回TryEmplaceResult 的实例,这是一个结构,其中包含一个指向新创建项目或阻止插入的原有项目的iterator ,以及一个布尔值inserted ,表示是否插入。
例如,这可以用来避免比较新旧大小或双重查找的模式。以前,您可能会写类似于......这样的代码:
QHash<int, MyType> hash; // [...] int myKey = getKey(); qsizetype oldSize = hash.size(); MyType &elem = hash[myKey]; if (oldSize != hash.size()) // Size changed: new element! initialize(elem); // [use elem...]
这样的代码:
QHash<int, MyType> hash; // [...] int myKey = getKey(); auto result = hash.tryEmplace(myKey); if (result.inserted) // New element! initialize(*result.iterator); // [use result.iterator...]
此函数在 Qt 6.9 中引入。
另请参阅 emplace()、tryInsert() 和insertOrAssign()。
[since 6.9]
template <typename K, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> QHash<Key, T>::TryEmplaceResult QHash::tryInsert(K &&key, const T &value)
[since 6.9]
QHash<Key, T>::TryEmplaceResult QHash::tryInsert(const Key &key, const T &value)
插入一个key 和value 值的新条目。如果key 的条目已经存在,则不会插入。
返回TryEmplaceResult 的实例,这是一个结构,其中包含一个指向新创建项或阻止插入的已存在项的iterator ,以及一个布尔值inserted ,表示是否插入。
该函数在 Qt 6.9 中引入。
另请参阅 insert()、tryEmplace() 和insertOrAssign()。
[since 6.9]
template <typename K, typename... Args, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> QHash<Key, T>::key_value_iterator QHash::try_emplace(QHash<Key, T>::const_iterator hint, K &&key, Args &&... args)
[since 6.9]
template <typename... Args> QHash<Key, T>::key_value_iterator QHash::try_emplace(QHash<Key, T>::const_iterator hint, Key &&key, Args &&... args)
[since 6.9]
template <typename... Args> QHash<Key, T>::key_value_iterator QHash::try_emplace(QHash<Key, T>::const_iterator hint, const Key &key, Args &&... args)
插入一个带有key 和由args 构建的值的新条目。如果带有key 的条目已经存在,则不会插入。
返回插入项目的迭代器,或返回阻止插入的项目。
hint 将被忽略。
提供这些函数是为了与标准库兼容。
此函数在 Qt 6.9 中引入。
另请参阅 emplace()、tryEmplace()、tryInsert() 和insertOrAssign()。
[since 6.9]
template <typename K, typename... Args, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(K &&key, Args &&... args)
[since 6.9]
template <typename... Args> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(Key &&key, Args &&... args)
[since 6.9]
template <typename... Args> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(const Key &key, Args &&... args)
插入一个带有key 和由args 构建的值的新条目。如果带有key 的条目已经存在,则不会插入。
返回值包括一对迭代器,其中一个是插入项(或阻止插入的项),另一个是表示是否插入的 bool。
提供这些函数是为了与标准库兼容。
此函数在 Qt 6.9 中引入。
另请参阅 emplace()、tryEmplace()、tryInsert() 和insertOrAssign()。
[since 6.9]
template <typename K, typename Value, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(K &&key, Value &&value)
[since 6.9]
template <typename Value> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(Key &&key, Value &&value)
[since 6.9]
template <typename Value> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(const Key &key, Value &&value)
尝试插入一个带有key 和value 的项目。如果带有key 的项目已经存在,其值将被value 覆盖。
返回TryEmplaceResult 的一个实例,这是一个结构,其中包含指向项目的iterator 和一个布尔值inserted ,表示项目是新创建的 (true
) 还是以前就存在的 (false
)。
该函数在 Qt 6.9 中引入。
另请参阅 insert()、tryEmplace() 和tryInsert()。
[since 6.9]
template <typename K, typename Value, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(K &&key, Value &&value)
[since 6.9]
template <typename Value> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(Key &&key, Value &&value)
[since 6.9]
template <typename Value> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(const Key &key, Value &&value)
尝试插入key 和value 的项目。如果key 的项目已经存在,其值将被value 覆盖。
返回值对包括指向项目的迭代器和布尔值,布尔值表示项目是新创建的(true
)还是以前就存在的(false
)。
提供这些函数是为了与标准库兼容。
该函数在 Qt 6.9 中引入。
另请参阅 insert(),tryEmplace(),tryInsert() 和insertOrAssign().
[since 6.9]
template <typename K, typename Value, QHash<Key, T>::if_heterogeneously_searchable<K> = true, QHash<Key, T>::if_key_constructible_from<K> = true> QHash<Key, T>::key_value_iterator QHash::insert_or_assign(QHash<Key, T>::const_iterator hint, K &&key, Value &&value)
[since 6.9]
template <typename Value> QHash<Key, T>::key_value_iterator QHash::insert_or_assign(QHash<Key, T>::const_iterator hint, Key &&key, Value &&value)
[since 6.9]
template <typename Value> QHash<Key, T>::key_value_iterator QHash::insert_or_assign(QHash<Key, T>::const_iterator hint, const Key &key, Value &&value)
尝试插入key 和value 的项目。如果key 的项目已经存在,其值将被value 覆盖。
返回值对包括指向项目的迭代器和布尔值,布尔值表示项目是新创建的(true
)还是以前就存在的(false
)。
hint 将被忽略。
提供这些函数是为了与标准库兼容。
该函数在 Qt 6.9 中引入。
另请参阅 insert()、tryEmplace() 和insertOrAssign()。
[noexcept]
QHash::QHash()
构造一个空散列。
另请参阅 clear().
QHash::QHash(std::initializer_list<std::pair<Key, T>> list)
用初始化列表list 中每个元素的副本构建哈希值。
template <typename InputIterator> QHash::QHash(InputIterator begin, InputIterator end)
构造一个哈希值,其中包含迭代器范围 [begin,end) 中每个元素的副本。由范围迭代的元素必须是具有first
和second
数据成员(如std::pair
)的对象,可分别转换为Key
和T
;或者迭代器必须具有key()
和value()
成员函数,可分别返回可转换为Key
的键和可转换为T
的值。
[noexcept]
QHash::QHash(const QHash<Key, T> &other)
构造other 的副本。
由于 QHash 是隐式共享的,因此该操作在恒定时间内完成。这使得从函数返回 QHash 的速度非常快。如果共享实例被修改,它将被复制(写时复制),这需要线性时间。
另请参见 operator=().
[noexcept]
QHash::QHash(QHash<Key, T> &&other)
Move- 构造一个 QHash 实例,使其指向other 所指向的同一对象。
QHash::~QHash()
销毁散列。哈希值的引用和所有迭代器都将失效。
QHash<Key, T>::iterator QHash::begin()
返回一个STL 样式的迭代器,指向散列中的第一个项目。
警告 下次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参阅 constBegin() 和end()。
[noexcept]
QHash<Key, T>::const_iterator QHash::begin() const
这是一个重载函数。
警告 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
qsizetype QHash::capacity() const
返回QHash 内部哈希表中的桶数。
该函数的唯一目的是提供一种微调QHash 内存使用情况的方法。一般来说,您很少需要调用此函数。如果想知道哈希表中有多少项,请调用size() 。
[noexcept]
QHash<Key, T>::const_iterator QHash::cbegin() const
返回指向散列中第一个项目的STL 样式迭代器。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
QHash<Key, T>::const_iterator QHash::cend() const
返回一个STL 样式的常量迭代器,指向哈希值中最后一个项目之后的假想项目。
警告 下次在散列上调用非常量函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept(...)]
void QHash::clear()
删除哈希值中的所有项目并释放所有内存。
注: 当std::is_nothrow_destructible<Node>::value
为true
时,此函数为 noexcept。
另请参阅 remove() 。
[noexcept]
QHash<Key, T>::const_iterator QHash::constBegin() const
返回指向散列中第一个项目的STL 样式迭代器。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
QHash<Key, T>::const_iterator QHash::constEnd() const
返回一个STL 样式的常量迭代器,指向哈希值中最后一个项目之后的假想项目。
警告 下次在散列上调用非常量函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参阅 constBegin() 和end()。
[noexcept]
QHash<Key, T>::const_iterator QHash::constFind(const Key &key) const
返回一个迭代器,指向散列中带有key 的项目。
如果哈希值中没有包含key 的项目,函数将返回constEnd().
警告: 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参见 find()。
[noexcept]
QHash<Key, T>::const_key_value_iterator QHash::constKeyValueBegin() const
返回指向散列中第一个条目的STL 样式迭代器。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参阅 keyValueBegin().
[noexcept]
QHash<Key, T>::const_key_value_iterator QHash::constKeyValueEnd() const
返回一个STL 样式的常量迭代器,指向散列中最后一个条目之后的虚条目。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参见 constKeyValueBegin().
[noexcept]
bool QHash::contains(const Key &key) const
如果哈希值包含key 的项目,则返回true
;否则返回false
。
另请参阅 count() 。
[noexcept]
qsizetype QHash::count(const Key &key) const
返回与key 相关联的项目数。
另请参阅 contains() 。
[noexcept]
qsizetype QHash::count() const
这是一个重载函数。
与size() 相同。
[noexcept]
bool QHash::empty() const
提供此函数是为了与 STL 兼容。它与isEmpty() 等价,如果哈希值为空,则返回 true;否则返回false
。
[noexcept]
QHash<Key, T>::iterator QHash::end()
返回一个STL 样式的迭代器,指向散列中最后一个项目之后的假想项目。
警告 下次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
QHash<Key, T>::const_iterator QHash::end() const
这是一个重载函数。
警告 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。
QHash<Key, T>::iterator QHash::erase(QHash<Key, T>::const_iterator pos)
从散列中删除与迭代器pos 相关联的(键、值)对,并返回指向散列中下一项的迭代器。
该函数不会导致QHash 重新散列其内部数据结构。这意味着可以在迭代时安全地调用该函数,并且不会影响哈希中项的顺序。例如
QHash<QObject *, int> objectHash; ... QHash<QObject *, int>::iterator i = objectHash.find(obj); while (i != objectHash.end() && i.key() == obj) { if (i.value() == 0) { i = objectHash.erase(i); } else { ++i; } }
警告: 下一次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。
QHash<Key, T>::iterator QHash::find(const Key &key)
返回一个迭代器,指向散列中带有key 的项目。
如果散列中没有包含key 的项目,则函数返回end() 。
如果散列中包含多个以key 命名的项目,该函数将返回一个指向最近插入值的迭代器。通过递增迭代器可以访问其他值。例如,下面的代码可以遍历具有相同键的所有项目:
QHash<QString, int> hash; ... QHash<QString, int>::const_iterator i = hash.find("HDR"); while (i != hash.end() && i.key() == "HDR") { cout << i.value() << endl; ++i; }
警告: 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
QHash<Key, T>::const_iterator QHash::find(const Key &key) const
这是一个重载函数。
警告 下次在散列上调用非定常函数或销毁散列时,返回的迭代器/引用应视为无效。
void QHash::insert(const QHash<Key, T> &other)
将other 散列中的所有项目插入此散列。
如果两个散列中的某个键相同,则其值将被other 中存储的值替换。
QHash<Key, T>::iterator QHash::insert(const Key &key, const T &value)
插入一个新项目,其key 和值为value 。
如果已有一个项目的值为key ,则该项目值将被替换为value 。
返回指向新元素/更新元素的迭代器。
警告: 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
bool QHash::isEmpty() const
如果散列不包含项目,则返回true
;否则返回 false。
另请参阅 size()。
[noexcept]
QHash<Key, T>::key_iterator QHash::keyBegin() const
返回指向散列中第一个键的STL 样式迭代器。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参阅 keyEnd().
[noexcept]
QHash<Key, T>::key_iterator QHash::keyEnd() const
返回一个常量STL 样式的迭代器,指向散列中最后一个键之后的假想项。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参见 keyBegin().
QHash<Key, T>::key_value_iterator QHash::keyValueBegin()
返回一个STL 样式的迭代器,指向散列中的第一个条目。
警告 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参阅 keyValueEnd().
[noexcept]
QHash<Key, T>::const_key_value_iterator QHash::keyValueBegin() const
返回指向散列中第一个条目的STL 样式迭代器。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参阅 keyValueEnd().
QHash<Key, T>::key_value_iterator QHash::keyValueEnd()
返回一个STL 样式的迭代器,指向散列中最后一个条目之后的虚条目。
警告 下次在散列上调用非const函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参见 keyValueBegin().
[noexcept]
QHash<Key, T>::const_key_value_iterator QHash::keyValueEnd() const
返回一个STL 样式的常量迭代器,指向散列中最后一个条目之后的虚条目。
警告 下次在散列上调用非常数函数或销毁散列时,返回的迭代器/引用应视为无效。
另请参见 keyValueBegin().
QList<Key> QHash::keys() const
以任意顺序返回一个包含哈希值中所有键的列表。
顺序保证与values() 使用的顺序相同。
此函数以线性时间创建一个新列表。通过从keyBegin() 到keyEnd() 的迭代,可以避免由此产生的时间和内存占用。
QList<Key> QHash::keys(const T &value) const
这是一个重载函数。
返回一个列表,其中包含与value 的值相关联的所有键,并按任意顺序排列。
该函数可能会比较慢(线性时间),因为QHash 的内部数据结构经过优化,可以按键而不是按值快速查找。
[noexcept]
float QHash::load_factor() const
返回QHash 内部哈希表的当前负载率。这与capacity()/size() 相同。所使用的实现方式会将负载率保持在 0.25 到 0.5 之间。这样可以避免哈希表发生过多碰撞而降低性能。
即使负载系数较低,哈希表的内存开销也非常小。
该方法纯粹是用于诊断目的,你应该很少需要自己调用它。
bool QHash::remove(const Key &key)
从散列表中删除key 的项目。如果键存在于散列中且项目已被移除,则返回 true,否则返回 false。
[since 6.1]
template <typename Predicate> qsizetype QHash::removeIf(Predicate pred)
从散列表中删除谓词pred 返回 true 的所有元素。
该函数支持使用QHash<Key, T>::iterator
类型参数或std::pair<const Key &, T &>
类型参数的谓词。
如果有,则返回已删除元素的数量。
此函数在 Qt 6.1 中引入。
void QHash::reserve(qsizetype size)
确保QHash 的内部哈希表至少有空间存储size 项,而无需扩大哈希表。
这意味着哈希表将至少包含 2 *size 个桶,以确保良好的性能。
该函数适用于需要建立庞大哈希表并希望避免重复重新分配的代码。例如
QHash<QString, int> hash; hash.reserve(20000); for (int i = 0; i < 20000; ++i) hash.insert(keys[i], values[i]);
理想情况下,size 应该是哈希表中预期的最大条目数。然后,QHash 将选择尽可能少的桶数,以便在不增加内部哈希表的情况下在表中存储size 条目。如果size 是一个低估的值,那么最坏的情况就是QHash 会慢一些。
一般来说,你很少需要调用这个函数。QHash内部哈希表会自动增长,在不浪费太多内存的情况下提供良好的性能。
[noexcept]
qsizetype QHash::size() const
返回哈希值中的项目数。
void QHash::squeeze()
减小QHash 内部哈希表的大小,以节省内存。
该函数的唯一目的是提供一种微调QHash 内存使用情况的方法。一般来说,您很少需要调用此函数。
[noexcept]
void QHash::swap(QHash<Key, T> &other)
将此散列值与other 互换。该操作速度非常快,从未出现过故障。
T QHash::take(const Key &key)
从散列表中删除key 的项目,并返回与之相关的值。
如果散列中不存在该项目,函数会简单地返回一个默认构造值。
如果不使用返回值,remove() 的效率更高。
另请参见 remove()。
QList<T> QHash::values() const
以任意顺序返回一个包含哈希值中所有值的列表。
该顺序保证与keys() 使用的顺序相同。
此函数以线性时间创建一个新列表。可以通过从keyValueBegin() 到keyValueEnd() 的迭代来避免所需的时间和内存占用。
[noexcept]
QHash<Key, T> &QHash::operator=(QHash<Key, T> &&other)
Move-assignsother 到此QHash 实例。
[noexcept(...)]
QHash<Key, T> &QHash::operator=(const QHash<Key, T> &other)
将other 赋值给该哈希值,并返回对该哈希值的引用。
注: 当std::is_nothrow_destructible<Node>::value
为true
时,此函数为 noexcept。
T &QHash::operator[](const Key &key)
以可修改引用的形式返回与key 相关联的值。
如果哈希值中没有key 的项目,函数会在哈希值中插入一个默认构造值 key ,并返回该值的引用。
警告: 下次在散列上调用非const 函数或销毁散列时,返回的迭代器/引用应视为无效。
[noexcept]
const T QHash::operator[](const Key &key) const
这是一个重载函数。
与 value() 相同。
相关非成员
[since 6.1]
template <typename Key, typename T, typename Predicate> qsizetype erase_if(QHash<Key, T> &hash, Predicate pred)
删除散列hash 中谓词pred 返回 true 的所有元素。
该函数支持使用QHash<Key, T>::iterator
类型参数或std::pair<const Key &, T &>
类型参数的谓词。
如果有,则返回已删除元素的数量。
此函数在 Qt 6.1 中引入。
[constexpr noexcept, since 6.5]
template <typename Enum, std::enable_if_t<std::is_enum_v<Enum>, bool> = true> size_t qHash(Enum key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
注: 在 Qt 6.5 之前,由于隐式转换为底层整数类型,非作用域枚举依赖于此函数的整数重载。对于作用域枚举,您必须自己实现重载。这仍然是一种向后兼容的修复方法,以便与旧版本的 Qt 保持兼容。
此函数在 Qt 6.5 中引入。
[noexcept]
size_t qHash(QDate key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(ulong key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(ushort key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept, since 6.0]
size_t qHash(wchar_t key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[noexcept]
size_t qHash(QLatin1StringView key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept, since 6.0]
size_t qHash(QPoint key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[noexcept]
size_t qHash(QTime key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept, since 6.9]
template <typename T, std::enable_if_t<std::is_same_v<T, bool>, bool> > size_t qHash(T key, size_t seed)
返回key 的哈希值,使用seed 作为计算的种子。
注: 这是 qHash(bool),只接受 bool 类型的参数,不接受仅转换为 bool 的参数。
注: 在 6.9 之前的 Qt 版本中,此重载无意中由一个未记录的 1 到 2 参数 qHash 适配器模板函数提供,其行为完全相同。
该函数在 Qt 6.9 中引入。
[constexpr noexcept]
size_t qHash(char key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept, since 6.0]
size_t qHash(char16_t key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[constexpr noexcept, since 6.0]
size_t qHash(char32_t key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[constexpr noexcept, since 6.0]
size_t qHash(char8_t key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[noexcept]
size_t qHash(const QBitArray &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept]
size_t qHash(const QByteArray &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(const QChar key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
size_t qHash(const QDateTime &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept(...)]
template <typename Key, typename T> size_t qHash(const QHash<Key, T> &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
qHash() 必须支持Key
和T
类型。
注: 当noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>()))
为true
时,此函数为 noexcept。
[noexcept(...)]
template <typename T> size_t qHash(const QSet<T> &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
qHash() 必须支持T
类型。
哈希值与key 中元素的顺序无关,也就是说,包含相同元素的集合的哈希值相同。
注意: 当noexcept(qHashRangeCommutative(key.begin(), key.end(), seed))
为true
时,此函数为 noexcept。
[noexcept]
size_t qHash(const QString &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[since 6.0]
size_t qHash(const QTypeRevision &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[noexcept]
size_t qHash(const QUrl &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
size_t qHash(const QVersionNumber &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept]
template <typename T> size_t qHash(const T *key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept(...)]
template <typename T1, typename T2> size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
qHash() 必须支持T1
和T2
类型。
注: 当QHashPrivate::noexceptPairHash<T1, T2>()
为true
时,此函数为 noexcept。
[noexcept]
size_t qHash(double key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept]
size_t qHash(float key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(int key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(long key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept]
size_t qHash(long double key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept, since 6.8]
size_t qHash(qint128 key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
注意: 该函数仅适用于支持本地 128 位整数类型的平台。
此函数在 Qt 6.8 中引入。
[constexpr noexcept]
size_t qHash(qint64 key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept, since 6.8]
size_t qHash(quint128 key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
注意: 该函数仅适用于支持本地 128 位整数类型的平台。
此函数在 Qt 6.8 中引入。
[constexpr noexcept]
size_t qHash(quint64 key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(short key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(signed char key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept, since 6.0]
size_t qHash(std::nullptr_t key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
此函数在 Qt 6.0 中引入。
[constexpr noexcept]
size_t qHash(uchar key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[constexpr noexcept]
size_t qHash(uint key, size_t seed = 0)
返回key 的哈希值,使用seed 作为计算的种子。
[noexcept]
size_t qHashBits(const void *p, size_t len, size_t seed = 0)
返回p 指向的大小为len 的内存块的哈希值,并使用seed 作为计算的种子。
该函数仅用于为您自己的自定义类型实现qHash() 功能。例如,下面是为 std::vector<int> 实现qHash() 重载的方法:
inline size_t qHash(const std::vector<int> &key, size_t seed = 0) { if (key.empty()) return seed; else return qHashBits(&key.front(), key.size() * sizeof(int), seed); }
这利用了 std::vector 连续布局数据的特性。如果情况并非如此,或者所包含的类型有填充,则应使用qHashRange() 代替。
需要重申的是,qHashBits() 的实现与 Qt XML 提供的qHash() 重载一样,随时都可能发生变化。在不同的 Qt 版本中,qHashBits() 都会给出相同的结果(对于相同的输入),这一点绝不能依赖。
另请参阅 qHashRange() 和qHashRangeCommutative()。
[constexpr noexcept(...), since 6.0]
template <typename... T> size_t qHashMulti(size_t seed, const T &... args)
返回args 的哈希值,使用seed 作为计算的种子,对每个元素连续应用qHash() 并将哈希值合并为一个哈希值。
请注意,参数的顺序很重要。如果顺序不重要,请使用qHashMultiCommutative() 代替。如果是对原始内存进行散列,请使用qHashBits() ;如果是对一个范围进行散列,请使用qHashRange() 。
提供此函数是为了方便您为自己的自定义类型实现qHash() 。例如,下面是为类Employee
实现qHash() 重载的方法:
#ifndef EMPLOYEE_H #define EMPLOYEE_H class Employee { public: Employee() {} Employee(const QString &name, QDate dateOfBirth); ... private: QString myName; QDate myDateOfBirth; }; inline bool operator==(const Employee &e1, const Employee &e2) { return e1.name() == e2.name() && e1.dateOfBirth() == e2.dateOfBirth(); } inline size_t qHash(const Employee &key, size_t seed) { return qHashMulti(seed, key.name(), key.dateOfBirth()); } #endif // EMPLOYEE_H
此函数在 Qt 6.0 中引入。
注意: 当std::conjunction_v<QtPrivate::QNothrowHashable<T>...>
为true
时,该函数为 noexcept。
另请参阅 qHashMultiCommutative 和qHashRange 。
[constexpr noexcept(...), since 6.0]
template <typename... T> size_t qHashMultiCommutative(size_t seed, const T &... args)
通过对每个元素连续应用qHash() 并将哈希值合并为单一哈希值,返回args 的哈希值,并使用seed 作为计算的种子。
参数的顺序并不重要。如果顺序很重要,请使用qHashMulti() 代替,因为它可能产生更好的散列质量。如果是对原始内存进行散列,请使用qHashBits() ;如果是对一个范围进行散列,请使用qHashRange() 。
提供此函数是为了方便您为自己的自定义类型实现qHash() 。
此函数在 Qt 6.0 中引入。
注意: 当std::conjunction_v<QtPrivate::QNothrowHashable<T>...>
为true
时,此函数为 noexcept。
另请参阅 qHashMulti 和qHashRange 。
[noexcept(...)]
template <typename InputIterator> size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)
返回范围 [first,last) 的哈希值,计算时使用seed 作为种子,对每个元素连续应用qHash() 并将哈希值合并为一个哈希值。
此函数的返回值取决于范围内元素的顺序。也就是说
{0, 1, 2}
和
{1, 2, 0}
散列值不同。如果顺序并不重要,例如对于哈希表,请使用qHashRangeCommutative() 代替。如果要对原始内存进行散列,请使用qHashBits() 。
该函数仅用于为您自己的自定义类型实现qHash() 功能。例如,下面是为 std::vector<int> 实现qHash() 重载的方法:
inline size_t qHash(const std::vector<int> &key, size_t seed = 0) { return qHashRange(key.begin(), key.end(), seed); }
需要重申的是,qHashRange() 的实现--就像 Qt XML 提供的qHash() 重载一样--可能随时发生变化。在不同的 Qt XML 版本中,qHashRange() 将给出相同的结果(对于相同的输入),即使元素类型的qHash() 会给出相同的结果,您也不能依赖这一事实。
注意: 当noexcept(qHash(*first))
为true
时,此函数为 noexcept。
另请参见 qHashBits() 和qHashRangeCommutative()。
[noexcept(...)]
template <typename InputIterator> size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)
通过对每个元素连续应用qHash() 并将哈希值合并为一个哈希值,返回范围 [first,last) 的哈希值,计算时使用seed 作为种子值。
此函数的返回值与范围内元素的顺序无关。也就是说
{0, 1, 2}
和
{1, 2, 0}
散列值相同。如果顺序很重要,例如对于向量和数组,请使用qHashRange() 代替。如果要对原始内存进行散列,请使用qHashBits()。
该函数仅用于为您自己的自定义类型实现qHash() 功能。例如,下面是为 std::unordered_set<int> 实现qHash() 重载的方法:
inline size_t qHash(const std::unordered_set<int> &key, size_t seed = 0) { return qHashRangeCommutative(key.begin(), key.end(), seed); }
需要重申的是,qHashRangeCommutative() 的实现--就像 Qt XML 提供的qHash() 重载一样--可能随时发生变化。在不同的 Qt XML 版本中,qHashRangeCommutative() 会给出相同的结果(对于相同的输入),即使元素类型的qHash() 会给出相同的结果,您也不能依赖这一事实。
注意: 当noexcept(qHash(*first))
为true
时,此函数为 noexcept。
另请参见 qHashBits() 和qHashRange()。
[noexcept]
bool operator!=(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
如果lhs 哈希值不等于rhs 哈希值,则返回true
;否则返回false
。
如果两个哈希值包含相同的(键、值)对,则视为相等。
此函数要求值类型实现operator==()
。
另请参见 operator==()。
template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QHash<Key, T> &hash)
将散列hash 写入流out 。
该函数要求键和值类型实现operator<<()
。
另请参阅 序列化 Qt 数据类型。
[noexcept]
bool operator==(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
如果lhs 哈希值等于rhs 哈希值,则返回true
;否则返回false
。
如果两个哈希值包含相同的(键、值)对,则视为相等。
此函数要求值类型实现operator==()
。
另请参见 operator!=()。
template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QHash<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.