QHash Class
template <typename Key, typename T> class QHashLa classe QHash est une classe modèle qui fournit un dictionnaire basé sur une table de hachage. En savoir plus...
| En-tête : | #include <QHash> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
- Liste de tous les membres, y compris les membres hérités
- Membres obsolètes
- QHash fait partie des classes implicitement partagées et des classes de conteneurs.
Remarque : toutes les fonctions de cette classe sont réentrantes.
Comparaisons avec QHash
| Catégorie | Types comparables |
|---|---|
| égalité | QHash |
Types publics
(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 |
Fonctions publiques
| 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.11) QHash<Key, T>::iterator | insert(Key &&key, T &&value) |
(since 6.11) QHash<Key, T>::iterator | insert(Key &&key, const T &value) |
(since 6.11) QHash<Key, T>::iterator | insert(const Key &key, 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 |
Éléments non membres associés
(since 6.1) qsizetype | erase_if(QHash<Key, T>&hash, Predicate pred) |
(since 6.5) size_t | qHash(Enum key, size_t seed = 0) |
| size_t | qHash(const QStringRef&key, size_t seed = 0) |
| size_t | qHash(const QMqttTopicFilter&filtre, size_t graine = 0) |
| size_t | qHash(const QSslKeyingMaterial&key) |
| size_t | qHash(const QGeoCoordinate&coordinate, size_t seed = 0) |
(since 6.0) size_t | qHash(QByteArrayView key, size_t seed = 0) |
| size_t | qHash(const QMqttTopicName&name, size_t seed = 0) |
| size_t | qHash(QSslEllipticCurve key, size_t seed = 0) |
| size_t | qHash(uchar clé, size_t graine = 0) |
| size_t | qHash(uint clé, size_t graine = 0) |
| size_t | qHash(ulong key, size_t seed = 0) |
| size_t | qHash(ushort key, size_t seed = 0) |
(since 6.0) size_t | qHash(wchar_t clé, size_t graine = 0) |
| size_t | qHash(QDate key, size_t seed = 0) |
| size_t | qHash(const QOcspResponse&key, size_t seed = 0) |
| size_t | qHash(QLatin1StringView key, size_t seed = 0) |
| size_t | qHash(const QSslCertificate&key, size_t seed = 0) |
(since 6.0) size_t | qHash(QPoint key, size_t seed = 0) |
| size_t | qHash(const QSslError&key, size_t seed = 0) |
| size_t | qHash(QTime key, size_t seed = 0) |
| size_t | qHash(const QSslKeyingMaterial&key, size_t seed) |
(since 6.9) size_t | qHash(T clé, size_t graine) |
| size_t | qHash(char key, size_t seed = 0) |
(since 6.0) size_t | qHash(char16_t clé, size_t graine = 0) |
(since 6.0) size_t | qHash(char32_t clé, size_t graine = 0) |
(since 6.0) size_t | qHash(char8_t clé, size_t graine = 0) |
| size_t | qHash(const QBitArray&key, size_t seed = 0) |
| size_t | qHash(const QByteArray&key, size_t seed = 0) |
| size_t | qHash(const QChar key, size_t seed = 0) |
| size_t | qHash(const QDateTime&key, size_t seed = 0) |
| size_t | qHash(const QHash<Key, T>&key, size_t seed = 0) |
| size_t | qHash(const QSet<T>&key, size_t seed = 0) |
| size_t | qHash(const QString&key, size_t seed = 0) |
(since 6.0) size_t | qHash(const QTypeRevision&key, size_t seed = 0) |
| size_t | qHash(const QUrl&key, size_t seed = 0) |
| size_t | qHash(const QVersionNumber&key, size_t seed = 0) |
| size_t | qHash(const T*key, size_t seed = 0) |
(since 6.12) size_t | qHash(const std::optional<T>&key, size_t seed = 0) |
| size_t | qHash(const std::pair<T1, T2>&key, size_t seed = 0) |
| size_t | qHash(double key, size_t seed = 0) |
| size_t | qHash(float key, size_t seed = 0) |
| size_t | qHash(int key, size_t seed = 0) |
| size_t | qHash(long key, size_t seed = 0) |
| size_t | qHash(long double key, size_t seed = 0) |
(since 6.8) size_t | qHash(qint128 key, size_t seed = 0) |
| size_t | qHash(qint64 key, size_t seed = 0) |
(since 6.8) size_t | qHash(quint128 key, size_t seed = 0) |
| size_t | qHash(quint64 key, size_t seed = 0) |
| size_t | qHash(short key, size_t seed = 0) |
| size_t | qHash(signed char key, size_t seed = 0) |
(since 6.0) size_t | qHash(std::nullptr_t clé, size_t graine = 0) |
| size_t | qHashBits(const void*p, size_t len, size_t seed = 0) |
(since 6.0) size_t | qHashMulti(size_t seed, const T &... args) |
(since 6.0) size_t | qHashMultiCommutative(size_t seed, const T &... args) |
| size_t | qHashRange(InputIterator first, InputIterator last, size_t seed = 0) |
| size_t | qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 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) |
Macros
(since 6.11) | QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD |
Description détaillée
QHash<KEY, T> est l'une des classes de conteneurs génériques de Qt, où Key est le type utilisé pour les clés de recherche et T est le type de valeur associée. Elle stocke des paires (clé, valeur) et permet une recherche très rapide de la valeur associée à une clé.
QHash offre des fonctionnalités très similaires à celles d'QMap. Les différences sont les suivantes :
- QHash permet des recherches plus rapides que ` QMap`. (Voir Complexité algorithmique pour plus de détails.)
- Lors d’une itération sur un ` QMap`, les éléments sont toujours triés par clé. Avec `QHash`, les éléments sont classés de manière arbitraire.
- Le type de clé d’un ` QMap ` doit implémenter l’opérateur `<()`. Le type de clé d’un `QHash` doit implémenter l’opérateur `==()` et une fonction de hachage globale appelée ` qHash()` (voir qHash).
Voici un exemple de QHash avec des clés de type « QString » et des valeurs de type « int » :
Pour insérer une paire (clé, valeur) dans le hachage, vous pouvez utiliser l'opérateur []() :
hash["one"] = 1;
hash["three"] = 3;
hash["seven"] = 7;Cela insère les trois paires (clé, valeur) suivantes dans le QHash : (« one », 1), (« three », 3) et (« seven », 7). Une autre façon d'insérer des éléments dans le hachage consiste à utiliser la méthode insert() :
hash.insert("twelve", 12);Pour rechercher une valeur, utilisez l’opérateur []() ou la fonction value() :
int num1 = hash["thirteen"];
int num2 = hash.value("thirteen");S'il n'y a pas d'élément avec la clé spécifiée dans le hachage, ces fonctions renvoient une valeur construite par défaut.
Si vous souhaitez vérifier si le hachage contient une clé particulière, utilisez la fonction ` contains()` :
int timeout = 30;
if (hash.contains("TIMEOUT"))
timeout = hash.value("TIMEOUT");Il existe également une surcharge de la fonction ` value()` qui utilise son deuxième argument comme valeur par défaut s'il n'y a pas d'élément avec la clé spécifiée :
int timeout = hash.value("TIMEOUT", 30);En général, nous vous recommandons d’utiliser ` contains()` et ` value()` plutôt que l’opérateur `[]()` pour rechercher une clé dans un hachage. En effet, l’opérateur `[]()` insère silencieusement un élément dans le hachage s’il n’existe aucun élément portant la même clé (à moins que le hachage ne soit de type `const`). Par exemple, l’extrait de code suivant créera 1 000 éléments en mémoire :
// WRONG
QHash<int, QWidget *> hash;
//...
for (int i = 0; i < 1000; ++i) {
if (hash[i] == okButton)
cout << "Found button at index " << i << endl;
}Pour éviter ce problème, remplacez hash[i] par hash.value(i) dans le code ci-dessus.
En interne, QHash utilise une table de hachage pour effectuer les recherches. Cette table de hachage s'agrandit automatiquement afin de permettre des recherches rapides sans gaspiller trop de mémoire. Vous pouvez toujours contrôler la taille de la table de hachage en appelant ` reserve()` si vous connaissez déjà approximativement le nombre d'éléments que contiendra le QHash, mais cela n'est pas nécessaire pour obtenir de bonnes performances. Vous pouvez également appeler capacity() pour récupérer la taille de la table de hachage.
Le QHash ne se réduira pas automatiquement si des éléments sont supprimés de la table. Pour minimiser la mémoire utilisée par le hachage, appelez squeeze().
Pour parcourir toutes les paires (clé, valeur) stockées dans un QHash, utilisez asKeyValueRange() :
for (const auto &[key, value] : std::as_const(hash).asKeyValueRange())
cout << qPrintable(key) << ": " << value << endl;Cette fonction renvoie un objet de plage pouvant être utilisé avec des liaisons structurées. Pour un contrôle manuel de l'itérateur, vous pouvez également utiliser des itérateurs traditionnels de type STL (QHash::const_iterator et QHash::iterator) :
for (auto it = hash.cbegin(); it != hash.cend(); ++it)
cout << qPrintable(it.key()) << ": " << it.value() << endl;Pour modifier des valeurs, utilisez des itérateurs :
for (auto it = hash.begin(); it != hash.end(); ++it)
it.value() += 1;QHash fournit également des itérateurs de type Java (QHashIterator et QMutableHashIterator) à des fins de compatibilité.
QHash n'étant pas ordonné, on ne peut pas supposer que la séquence d'un itérateur soit prévisible. Si un tri par clé est nécessaire, utilisez un QMap.
Un QHash n'autorise qu'une seule valeur par clé. Si vous appelez insert() avec une clé qui existe déjà dans le QHash, la valeur précédente est effacée. Par exemple :
hash.insert("plenty", 100);
hash.insert("plenty", 2000);
// hash.value("plenty") == 2000Si vous devez stocker plusieurs entrées pour une même clé dans la table de hachage, utilisez ` QMultiHash`.
Si vous avez uniquement besoin d'extraire les valeurs d'un hachage (et non les clés), vous pouvez également utiliser une boucle « for » basée sur une plage :
Il existe plusieurs façons de supprimer des éléments de la table de hachage. L'une d'elles consiste à appeler ` remove()` ; cela supprimera tout élément ayant la clé indiquée. Une autre méthode consiste à utiliser ` QMutableHashIterator::remove()`. De plus, vous pouvez vider l'intégralité de la table de hachage à l'aide de ` clear()`.
Les types de données des clés et des valeurs de `QHash` doivent être des types de données assignables. Vous ne pouvez pas, par exemple, stocker un ` QWidget ` en tant que valeur ; vous devez plutôt stocker un ` QWidget *`.
La fonction de hachage
Le type de clé d'un QHash doit répondre à des exigences supplémentaires, outre le fait d'être un type de données assignable : il doit fournir l'opérateur ==(), et il doit également exister une fonction de hachage qui renvoie une valeur de hachage pour un argument du type de la clé.
La fonction de hachage calcule une valeur numérique à partir d’une clé. Elle peut utiliser n’importe quel algorithme imaginable, à condition de toujours renvoyer la même valeur pour un même argument. En d’autres termes, si e1 == e2, alors hash(e1) == hash(e2) doit également être vrai. Cependant, pour obtenir de bonnes performances, la fonction de hachage doit s’efforcer, dans la mesure du possible, de renvoyer des valeurs de hachage différentes pour des clés différentes.
Une fonction de hachage pour un type de clé K peut être fournie de deux manières différentes.
La première consiste à surcharger la méthode ` qHash() ` dans l'espace de noms ` K`. La fonction ` qHash() ` doit présenter l'une des signatures suivantes :
size_t qHash(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 useLes surcharges à deux arguments prennent un entier non signé destiné à servir de graine pour le calcul de la fonction de hachage. Cette graine est fournie par QHash afin d’éviter une famille d’ algorithmic complexity attacks.
Remarque : dans Qt 6, il est possible de définir une surcharge qHash() ne prenant qu'un seul argument ; cette fonctionnalité est toutefois dépréciée. À partir de Qt 7, l'utilisation d'une surcharge à deux arguments sera obligatoire. Si une surcharge à un argument et une surcharge à deux arguments sont toutes deux définies pour un type de clé, c’est cette dernière qui est utilisée par QHash (notez que vous pouvez simplement définir une version à deux arguments et utiliser une valeur par défaut pour le paramètre de graine). Dans Qt 6, il est possible de désactiver la prise en charge de la surcharge à argument unique de ` qHash ` en définissant la macro ` QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD `.
La deuxième façon de fournir une fonction de hachage consiste à spécialiser la classe ` std::hash ` pour le type de clé ` K`, et à lui fournir un opérateur d’appel de fonction adapté :
namespace std
{
template <> struct hash<K>
{
// seed is optional
size_t operator()(const K &key, size_t seed = 0) const;
};
}L’argument seed a la même signification que pour ` qHash()` et peut être omis.
Cette deuxième méthode permet de réutiliser la même fonction de hachage entre QHash et les conteneurs associatifs non ordonnés de la bibliothèque standard C++. Si une surcharge de ` qHash() ` et une spécialisation de ` std::hash ` sont toutes deux fournies pour un type, la surcharge de ` qHash() ` est privilégiée.
Voici une liste partielle des types C++ et Qt pouvant servir de clés dans un QHash : tout type entier (char, unsigned long, etc.), tout type de pointeur, QChar, QString et QByteArray. Pour tous ces types, l’en-tête <QHash> définit une fonction qHash() qui calcule une valeur de hachage adéquate. De nombreuses autres classes Qt déclarent également une surcharge de qHash pour leur type ; veuillez vous reporter à la documentation de chaque classe.
Si vous souhaitez utiliser d’autres types comme clé, assurez-vous de fournir l’opérateur ==() et une implémentation de la fonction hash.
La fonction de commodité qHashMulti() peut être utilisée pour implémenter qHash() pour un type personnalisé, lorsque l'on souhaite généralement générer une valeur de hachage à partir de plusieurs champs :
Exemple :
#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)
{
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_HDans l’exemple ci-dessus, nous nous sommes appuyés sur l’implémentation propre à Qt de ` qHash()` pour ` QString ` et ` QDate ` afin d’obtenir une valeur de hachage pour le nom et la date de naissance de l’employé, respectivement.
Notez que l’implémentation des surcharges de la fonction ` qHash()` proposées par Qt peut changer à tout moment. Vous ne devez pas partir du principe que la fonction ` qHash()` donnera les mêmes résultats (pour les mêmes entrées) d’une version de Qt à l’autre.
Attaques par complexité algorithmique
Toutes les tables de hachage sont vulnérables à une catégorie particulière d’attaques par déni de service, dans lesquelles l’attaquant précalculent soigneusement un ensemble de clés différentes qui seront hachées dans le même compartiment d’une table de hachage (ou qui auront même exactement la même valeur de hachage). L’attaque vise à provoquer le pire comportement algorithmique possible (O(n) au lieu d’un O(1) amorti, voir Complexité algorithmique pour plus de détails) lorsque les données sont introduites dans la table.
Afin d’éviter ce comportement du pire cas, le calcul de la valeur de hachage effectué par ` qHash()` peut être « salé » à l’aide d’une graine aléatoire, ce qui annule l’ampleur de l’attaque. Cette graine est générée automatiquement par QHash une fois par processus, puis transmise par QHash en tant que deuxième argument de la surcharge à deux arguments de la fonction ` qHash()`.
Cette randomisation de QHash est activée par défaut. Même si les programmes ne devraient jamais dépendre d’un ordre QHash particulier, il peut exister des situations où vous avez temporairement besoin d’un comportement déterministe, par exemple pour le débogage ou les tests de régression. Pour désactiver la randomisation, définissez la variable d’environnement QT_HASH_SEED sur la valeur 0. Vous pouvez également appeler la fonction QHashSeed::setDeterministicGlobalSeed().
Voir également QHashIterator, QMutableHashIterator, QMap et QSet.
Documentation sur les types de membres
QHash::ConstIterator
Synonyme de « QHash::const_iterator » dans le style Qt.
QHash::Iterator
Synonyme de « QHash::iterator » dans le style Qt XML.
QHash::const_key_value_iterator
Le typedef `QHash::const_key_value_iterator` fournit un itérateur `const` de type STL pour ` QHash`.
QHash::const_key_value_iterator est essentiellement identique à ` QHash::const_iterator `, à la différence près que l'opérateur `*()` renvoie une paire clé/valeur au lieu d'une valeur.
Voir également QKeyValueIterator.
[alias] QHash::difference_type
Définition de type pour ptrdiff_t. Fournie à des fins de compatibilité avec la STL.
[alias] QHash::key_type
Définition de type pour « Key ». Fournie à des fins de compatibilité avec la STL.
QHash::key_value_iterator
Le typedef `QHash::key_value_iterator` fournit un itérateur de type STL pour ` QHash`.
QHash::key_value_iterator est essentiellement identique à QHash::iterator, à la différence que l'opérateur *() renvoie une paire clé/valeur au lieu d'une valeur.
Voir également QKeyValueIterator.
[alias] QHash::mapped_type
Définition de type pour T. Fournie à des fins de compatibilité avec la STL.
[alias] QHash::size_type
Définition de type pour `int`. Fournie à des fins de compatibilité avec la STL.
Documentation des fonctions membres
[noexcept default] QHash::QHash()
Crée un hachage vide.
Voir aussi clear().
QHash::QHash(std::initializer_list<std::pair<Key, T>> list)
Crée un hachage contenant une copie de chacun des éléments de la liste d'initialisation list.
template <typename InputIterator> QHash::QHash(InputIterator begin, InputIterator end)
Construit un hachage à partir d'une copie de chacun des éléments de la plage d'itérateurs [begin, end). Soit les éléments parcourus par la plage doivent être des objets comportant les membres de données first et second (comme std::pair), convertibles respectivement en Key et en T; soit les itérateurs doivent disposer des fonctions membres key() et value(), renvoyant respectivement une clé convertible en Key et une valeur convertible en T.
[noexcept] QHash::QHash(const QHash<Key, T> &other)
Crée une copie de other.
Cette opération s'effectue en temps constant, car QHash est implicitement partagé. Cela rend très rapide le retour d’un QHash depuis une fonction. Si une instance partagée est modifiée, elle sera copiée (copie à l’écriture), ce qui prend un temps linéaire.
Voir également operator=().
[noexcept] QHash::QHash(QHash<Key, T> &&other)
Crée une instance de QHash par « move », de sorte qu'elle pointe vers le même objet que celui vers lequel pointait other.
QHash::~QHash()
Supprime le hachage. Les références aux valeurs contenues dans ce hachage ainsi que tous les itérateurs associés à celui-ci deviennent invalides.
[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 &
Renvoie un objet « range » qui permet de parcourir ce hachage sous forme de paires clé/valeur. Par exemple, cet objet « range » peut être utilisé dans une boucle « for » basée sur une plage, en combinaison avec une déclaration de liaison structurée :
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
}Notez que la clé et la valeur obtenues de cette manière sont toutes deux des références à celles contenues dans le hachage. Plus précisément, la modification de la valeur entraînera la modification du hachage lui-même.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Ces fonctions ont été introduites dans Qt 6.4.
Voir également QKeyValueIterator.
QHash<Key, T>::iterator QHash::begin()
Renvoie un itérateur de type STL pointant vers le premier élément du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir également constBegin() et end().
[noexcept] QHash<Key, T>::const_iterator QHash::begin() const
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Il s'agit d'une fonction surchargée.
[noexcept] qsizetype QHash::capacity() const
Renvoie le nombre de compartiments dans la table de hachage interne de QHash.
Cette fonction a pour seul objectif de permettre un réglage fin de l'utilisation de la mémoire par la fonction « QHash ». En général, vous n'aurez que très rarement besoin d'appeler cette fonction. Si vous souhaitez connaître le nombre d'éléments contenus dans le hachage, appelez la fonction « size »().
Voir également reserve() et squeeze().
[noexcept] QHash<Key, T>::const_iterator QHash::cbegin() const
Renvoie un itérateur de type STL constant pointant vers le premier élément du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
[noexcept] QHash<Key, T>::const_iterator QHash::cend() const
Renvoie un itérateur constant de type STL pointant vers l'élément imaginaire situé après le dernier élément du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
Voir également cbegin() et end().
[noexcept(...)] void QHash::clear()
Supprime tous les éléments du hachage et libère toute la mémoire qu'il occupe.
Remarque : cette fonction est de type « noexcept » lorsque ` std::is_nothrow_destructible<Node>::value ` est défini comme ` true`.
Voir également ` remove()`.
[noexcept] QHash<Key, T>::const_iterator QHash::constBegin() const
Renvoie un itérateur const de type STL pointant vers le premier élément du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
Voir également begin() et constEnd().
[noexcept] QHash<Key, T>::const_iterator QHash::constEnd() const
Renvoie un itérateur de type STL constant pointant vers l'élément imaginaire situé après le dernier élément du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le tableau, ou lorsque celui-ci est détruit.
Voir également constBegin() et end().
[noexcept] QHash<Key, T>::const_iterator QHash::constFind(const Key &key) const
Renvoie un itérateur pointant vers l'élément de l'key dans le hachage.
Si le hachage ne contient aucun élément portant l'key, la fonction renvoie constEnd().
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir aussi find().
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueBegin() const
Renvoie un itérateur de type const, conforme à la norme STL, pointant vers la première entrée du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
Voir également ` keyValueBegin()`.
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueEnd() const
Renvoie un itérateur de type STL « const » pointant vers l'entrée imaginaire située après la dernière entrée du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
Voir aussi ` constKeyValueBegin()`.
[noexcept] bool QHash::contains(const Key &key) const
Renvoie « true » si le hachage contient un élément dont la valeur est « key » ; sinon, renvoie « false ».
Voir aussi count().
[noexcept] qsizetype QHash::count(const Key &key) const
Renvoie le nombre d'éléments associés à l'key.
Voir aussi contains().
[noexcept] qsizetype QHash::count() const
Identique à ` size()`.
Il s'agit d'une fonction surchargée.
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)
Insère un nouvel élément dans le conteneur. Ce nouvel élément est construit sur place à l'aide de ` args ` comme arguments de construction. Si l'élément existe déjà dans le conteneur, il est remplacé.
Renvoie un itérateur pointant vers le nouvel élément.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
[noexcept] bool QHash::empty() const
Cette fonction est fournie à des fins de compatibilité avec la STL. Elle est équivalente à ` isEmpty()`, qui renvoie `true` si le hachage est vide ; dans le cas contraire, elle renvoie ` false`.
[noexcept] QHash<Key, T>::iterator QHash::end()
Renvoie un itérateur de type STL pointant vers l'élément imaginaire situé après le dernier élément du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir également begin() et constEnd().
[noexcept] QHash<Key, T>::const_iterator QHash::end() const
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalidés lors du prochain appel d'une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Il s'agit d'une fonction surchargée.
QHash<Key, T>::iterator QHash::erase(QHash<Key, T>::const_iterator pos)
Supprime de l'pos la paire (clé, valeur) associée à l' de l' , puis renvoie un itérateur vers l'élément suivant de l' .
Cette fonction ne provoque jamais de réorganisation de la structure de données interne d'QHash. Cela signifie qu'elle peut être appelée en toute sécurité pendant une itération et qu'elle n'affectera pas l'ordre des éléments dans le hachage. Par exemple :
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;
}
}Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir également remove(), take() et find().
QHash<Key, T>::iterator QHash::find(const Key &key)
Renvoie un itérateur pointant vers l'élément de l'key dans le hachage.
Si le hachage ne contient aucun élément portant l'key, la fonction renvoie ` end()`.
Si le hachage contient plusieurs éléments portant l'key, cette fonction renvoie un itérateur pointant vers la valeur insérée le plus récemment. Les autres valeurs sont accessibles en incrémentant l'itérateur. Voici, par exemple, un extrait de code qui parcourt tous les éléments portant la même clé :
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;
}Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir également value() et values().
[noexcept] QHash<Key, T>::const_iterator QHash::find(const Key &key) const
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Il s'agit d'une fonction surchargée.
void QHash::insert(const QHash<Key, T> &other)
Insère tous les éléments du hachage other dans ce hachage.
Si une clé est commune aux deux hachages, sa valeur sera remplacée par celle stockée dans ` other`.
QHash<Key, T>::iterator QHash::insert(const Key &key, const T &value)
Insère un nouvel élément avec l'key et la valeur value.
S'il existe déjà un élément avec l'key, la valeur de cet élément est remplacée par value.
L'insertion d'une paire clé/valeur avec une clé existante remplace la valeur existante.
Renvoie un itérateur pointant vers l’élément nouveau ou mis à jour.
Avertissement : les itérateurs et référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
[since 6.11] QHash<Key, T>::iterator QHash::insert(Key &&key, T &&value)
[since 6.11] QHash<Key, T>::iterator QHash::insert(Key &&key, const T &value)
[since 6.11] QHash<Key, T>::iterator QHash::insert(const Key &key, T &&value)
Ces fonctions ont été introduites dans Qt 6.11.
[since 6.9] template <typename K, typename Value> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Tente d'insérer un élément avec les valeurs key et value. Si un élément avec la valeur key existe déjà, sa valeur est écrasée par value.
Renvoie une instance de ` TryEmplaceResult`, une structure contenant une ` iterator ` vers l’élément, ainsi qu’un booléen, ` inserted`, indiquant si l’élément a été nouvellement créé (`true`) ou s’il existait déjà (`false`).
Ces fonctions ont été introduites dans Qt 6.9.
Voir également insert(), tryEmplace() et tryInsert().
[since 6.9] template <typename K, typename Value> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Tente d'insérer un élément avec les valeurs key et value. Si un élément avec key existe déjà, sa valeur est écrasée par value.
Renvoie un couple composé d'un itérateur pointant vers l'élément et d'un booléen indiquant si l'élément a été nouvellement créé (true) ou s'il existait déjà (false).
Ces fonctions sont fournies à des fins de compatibilité avec la bibliothèque standard.
Ces fonctions ont été introduites dans Qt 6.9.
Voir également insert(), tryEmplace(), tryInsert() et insertOrAssign().
[since 6.9] template <typename K, typename Value> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Tente d’insérer un élément avec les valeurs key et value. Si un élément avec la valeur key existe déjà, sa valeur est écrasée par value.
Renvoie une paire composée d’un itérateur pointant vers l’élément et d’un booléen indiquant si l’élément a été nouvellement créé (true) ou s’il existait déjà (false).
hint est ignoré.
Ces fonctions sont fournies à des fins de compatibilité avec la bibliothèque standard.
Ces fonctions ont été introduites dans Qt 6.9.
Voir également insert(), tryEmplace() et insertOrAssign().
[noexcept] bool QHash::isEmpty() const
Renvoie « true » si le hachage ne contient aucun élément ; sinon, renvoie « false ».
Voir aussi size().
[noexcept] Key QHash::key(const T &value) const
[noexcept] Key QHash::key(const T &value, const Key &defaultKey) const
Renvoie la première clé associée à value. Si le hachage ne contient aucun élément associé à value, renvoie defaultKey, ou une clé construite par défaut si ce paramètre n'a pas été fourni.
Cette fonction peut être lente (temps linéaire), car la structure de données interne de ` QHash` est optimisée pour une recherche rapide par clé, et non par valeur.
[noexcept] QHash<Key, T>::key_iterator QHash::keyBegin() const
Renvoie un itérateur de type STL constant pointant vers la première clé du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
Voir aussi ` keyEnd()`.
[noexcept] QHash<Key, T>::key_iterator QHash::keyEnd() const
Renvoie un itérateur constant de type STL pointant vers l'élément imaginaire situé après la dernière clé du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque celui-ci est détruit.
Voir aussi ` keyBegin()`.
QHash<Key, T>::key_value_iterator QHash::keyValueBegin()
Renvoie un itérateur de type STL pointant vers la première entrée du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le tableau de hachage, ou lorsque celui-ci est détruit.
Voir aussi ` keyValueEnd()`.
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueBegin() const
Renvoie un itérateur de type STL constant pointant vers la première entrée du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d'une fonction non const sur le hachage, ou lorsque le hachage est détruit.
Voir également ` keyValueEnd()`.
QHash<Key, T>::key_value_iterator QHash::keyValueEnd()
Renvoie un itérateur de type STL pointant vers l'entrée imaginaire située après la dernière entrée du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir aussi keyValueBegin().
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueEnd() const
Renvoie un itérateur constant de type STL pointant vers l'entrée imaginaire située après la dernière entrée du hachage.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel à une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir aussi ` keyValueBegin()`.
QList<Key> QHash::keys() const
Renvoie une liste contenant toutes les clés du hachage, dans un ordre aléatoire.
L'ordre est garanti d'être le même que celui utilisé par values().
Cette fonction crée une nouvelle liste, en temps linéaire. La consommation de temps et de mémoire que cela implique peut être évitée en itérant de ` keyBegin()` à ` keyEnd()`.
Voir également values() et key().
QList<Key> QHash::keys(const T &value) const
Renvoie une liste contenant toutes les clés associées à la valeur value, dans un ordre aléatoire.
Cette fonction peut être lente (temps linéaire), car la structure de données interne de ` QHash` est optimisée pour une recherche rapide par clé, et non par valeur.
Il s'agit d'une fonction surchargée.
[noexcept] float QHash::load_factor() const
Renvoie le facteur de charge actuel de la table de hachage interne de l’ QHash. Cette fonction est équivalente à capacity()/size(). L’implémentation utilisée visera à maintenir le facteur de charge entre 0,25 et 0,5. Cela permet d’éviter un nombre trop élevé de collisions dans la table de hachage, qui pourraient nuire aux performances.
Même avec un faible facteur de charge, l'implémentation de la table de hachage n'entraîne qu'une très faible surconsommation de mémoire.
Cette méthode est exclusivement destinée à des fins de diagnostic et vous ne devriez que très rarement avoir besoin de l'appeler vous-même.
Voir également reserve() et squeeze().
bool QHash::remove(const Key &key)
Supprime de l'espace de noms l'élément dont la clé est « key ». Renvoie « true » si la clé existe dans l'espace de noms et que l'élément a bien été supprimé, et « false » dans le cas contraire.
Voir également ` clear()` et ` take()`.
[since 6.1] template <typename Predicate> qsizetype QHash::removeIf(Predicate pred)
Supprime du hachage tous les éléments pour lesquels le prédicat pred renvoie « vrai ».
La fonction prend en charge les prédicats qui acceptent soit un argument de type QHash<Key, T>::iterator, soit un argument de type std::pair<const Key &, T &>.
Renvoie le nombre d'éléments supprimés, le cas échéant.
Cette fonction a été introduite dans Qt 6.1.
Voir également clear() et take().
void QHash::reserve(qsizetype size)
Garantit que la table de hachage interne de ` QHash` dispose de suffisamment d'espace pour stocker au moins ` size ` éléments sans avoir à agrandir la table de hachage.
Cela implique que la table de hachage contiendra au moins 2 * size compartiments afin de garantir de bonnes performances
Cette fonction est utile pour le code qui doit construire un hachage de grande taille et qui souhaite éviter des réallocations répétées. Par exemple :
QHash<QString, int> hash;
hash.reserve(20000);
for (int i = 0; i < 20000; ++i)
hash.insert(keys[i], values[i]);Idéalement, size devrait correspondre au nombre maximal d’éléments attendus dans le hachage. QHash choisira alors le plus petit nombre possible de compartiments permettant de stocker size éléments dans la table sans avoir à agrandir la table de hachage interne. Si size est sous-estimé, le pire qui puisse arriver est que l’ QHash soit légèrement plus lente.
En général, vous n’aurez que très rarement besoin d’appeler cette fonction. La table de hachage interne de QHash s’agrandit automatiquement pour offrir de bonnes performances sans gaspiller trop de mémoire.
Voir également squeeze() et capacity().
[noexcept] qsizetype QHash::size() const
Renvoie le nombre d'éléments contenus dans le hachage.
Voir également isEmpty() et count().
void QHash::squeeze()
Réduit la taille de la table de hachage interne de l'QHash afin d'économiser de la mémoire.
Le seul but de cette fonction est de permettre un réglage fin de l’utilisation de la mémoire par QHash. En général, vous n’aurez que très rarement besoin d’appeler cette fonction.
Voir également ` reserve()` et ` capacity()`.
[noexcept] void QHash::swap(QHash<Key, T> &other)
Permute cette valeur de hachage avec celle de other. Cette opération est très rapide et ne rencontre jamais d'échec.
T QHash::take(const Key &key)
Supprime de l'key l'élément portant l' et renvoie la valeur qui lui est associée.
Si l'élément n'existe pas dans le hachage, la fonction renvoie simplement une valeur construite par défaut.
Si vous n'utilisez pas la valeur renvoyée, la fonction ` remove()` est plus efficace.
Voir aussi remove().
[since 6.9] template <typename K, typename... Args> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Insère un nouvel élément avec l'key et une valeur construite à partir de args. Si un élément avec l'key existe déjà, aucune insertion n'a lieu.
Renvoie une instance de ` TryEmplaceResult`, une structure contenant une ` iterator ` vers l’élément nouvellement créé, ou vers l’élément préexistant qui a empêché l’insertion, ainsi qu’un booléen, ` inserted`, indiquant si l’insertion a eu lieu.
Par exemple, cela peut être utilisé pour éviter de comparer l’ancienne et la nouvelle taille ou d’effectuer des recherches doubles. Là où vous auriez auparavant écrit un code tel que :
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...]Vous pouvez désormais écrire :
QHash<int, MyType> hash;
// [...]
int myKey = getKey();
auto result = hash.tryEmplace(myKey);
if (result.inserted) // New element!
initialize(*result.iterator);
// [use result.iterator...]Ces fonctions ont été introduites dans Qt 6.9.
Voir également emplace(), tryInsert() et insertOrAssign().
[since 6.9] template <typename K> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Insère un nouvel élément avec l'key et la valeur value. Si un élément portant l'key existe déjà, aucune insertion n'a lieu.
Renvoie une instance de ` TryEmplaceResult`, une structure contenant un ` iterator ` vers l'élément nouvellement créé, ou vers l'élément préexistant qui a empêché l'insertion, ainsi qu'un booléen, ` inserted`, indiquant si l'insertion a eu lieu.
Ces fonctions ont été introduites dans Qt 6.9.
Voir également insert(), tryEmplace() et insertOrAssign().
[since 6.9] template <typename K, typename... Args> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Insère un nouvel élément dont l'key et la valeur sont dérivés de args. Si un élément dont l'key existe déjà, aucune insertion n'a lieu.
Renvoie un couple composé d'un itérateur vers l'élément inséré (ou vers l'élément qui a empêché l'insertion) et d'un booléen indiquant si l'insertion a eu lieu.
Ces fonctions sont fournies à des fins de compatibilité avec la bibliothèque standard.
Ces fonctions ont été introduites dans Qt 6.9.
Voir également emplace(), tryEmplace(), tryInsert() et insertOrAssign().
[since 6.9] template <typename K, typename... Args> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> 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)
Insère un nouvel élément dont l'key est spécifié et dont la valeur est construite à partir de args. Si un élément dont l'key est déjà présent, aucune insertion n'a lieu.
Renvoie l'itérateur de l'élément inséré, ou celui de l'élément qui a empêché l'insertion.
hint est ignoré.
Ces fonctions sont fournies à des fins de compatibilité avec la bibliothèque standard.
Ces fonctions ont été introduites dans Qt 6.9.
Voir également emplace(), tryEmplace(), tryInsert() et insertOrAssign().
[noexcept] T QHash::value(const Key &key) const
[noexcept] T QHash::value(const Key &key, const T &defaultValue) const
Renvoie la valeur associée à l'key.
Si le hachage ne contient aucun élément correspondant à l'key, la fonction renvoie defaultValue, ou une valeur construite par défaut si ce paramètre n'a pas été fourni.
QList<T> QHash::values() const
Renvoie une liste contenant toutes les valeurs du hachage, dans un ordre aléatoire.
L'ordre est garanti d'être identique à celui utilisé par la fonction keys().
Cette fonction crée une nouvelle liste, en temps linéaire. La consommation de temps et de mémoire que cela implique peut être évitée en itérant de ` keyValueBegin()` à ` keyValueEnd()`.
Voir également keys() et value().
[noexcept] QHash<Key, T> &QHash::operator=(QHash<Key, T> &&other)
Cette opération attribue l'other à cette instance QHash.
[noexcept] QHash<Key, T> &QHash::operator=(const QHash<Key, T> &other)
Attribue la valeur « other » à ce hachage et renvoie une référence à ce hachage.
T &QHash::operator[](const Key &key)
Renvoie la valeur associée à l'key sous forme de référence modifiable.
Si le hachage ne contient aucun élément portant l'key, la fonction insère dans le hachage une valeur construite par défaut portant l'key, puis renvoie une référence à celle-ci.
Avertissement : les itérateurs/référencesrenvoyés doivent être considérés comme invalides dès le prochain appel d’une fonction non-const sur le hachage, ou lorsque le hachage est détruit.
Voir également insert() et value().
[noexcept] const T QHash::operator[](const Key &key) const
Identique à ` value()`.
Il s'agit d'une fonction surchargée.
Éléments non membres associés
[since 6.1] template <
typename Key,
typename T,
typename Predicate
>
qsizetype erase_if(QHash<Key, T> &hash, Predicate pred)
Supprime du hachage hash tous les éléments pour lesquels le prédicat pred renvoie « vrai ».
La fonction prend en charge les prédicats qui acceptent soit un argument de type ` QHash<Key, T>::iterator`, soit un argument de type ` std::pair<const Key &, T &>`.
Renvoie le nombre d'éléments supprimés, le cas échéant.
Cette fonction a été introduite dans 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)
Renvoie la valeur de hachage de ` key`, en utilisant ` seed ` comme graine pour le calcul.
Remarque : avant Qt 6.5, les énumérations sans portée s'appuyaient sur les surcharges entières de cette fonction en raison de la conversion implicite vers leurs types entiers sous-jacents. Pour les énumérations avec portée, il fallait implémenter soi-même une surcharge. Il s'agit toujours d'une correction compatible avec les versions antérieures afin de rester compatible avec les anciennes versions de Qt.
Cette fonction a été introduite dans Qt 6.5.
[noexcept, since 6.0] size_t qHash(QByteArrayView key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[constexpr noexcept] size_t qHash(uchar key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(uint key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(ulong key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(ushort key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept, since 6.0] size_t qHash(wchar_t key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[noexcept] size_t qHash(QDate key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept] size_t qHash(QLatin1StringView key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept, since 6.0] size_t qHash(QPoint key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme valeur de départ pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[noexcept] size_t qHash(QTime key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[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)
Renvoie la valeur de hachage de key, en utilisant seed comme valeur de départ pour le calcul.
Remarque : il s'agit de qHash(bool), limité à n'accepter que des arguments de type bool, et non des arguments de types qui se convertissent simplement en bool.
Remarque : dans les versions de Qt antérieures à la version 6.9, cette surcharge était fournie de manière involontaire par une fonction modèle d'adaptateur qHash non documentée, passant d'un argument à deux, et présentant un comportement identique.
Cette fonction a été introduite dans Qt 6.9.
[constexpr noexcept] size_t qHash(char key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept, since 6.0] size_t qHash(char16_t key, size_t seed = 0)
Renvoie la valeur de hachage de ` key`, en utilisant ` seed ` comme valeur de départ pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[constexpr noexcept, since 6.0] size_t qHash(char32_t key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[constexpr noexcept, since 6.0] size_t qHash(char8_t key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[noexcept] size_t qHash(const QBitArray &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept] size_t qHash(const QByteArray &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(const QChar key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
size_t qHash(const QDateTime &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept(...)] template <typename Key, typename T> size_t qHash(const QHash<Key, T> &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Les types Key et T doivent être pris en charge par qHash().
Remarque : cette fonction est de type `noexcept` lorsque ` noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())) ` est égal à ` true`.
[noexcept(...)] template <typename T> size_t qHash(const QSet<T> &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Le type T doit être pris en charge par qHash().
La valeur de hachage est indépendante de l’ordre des éléments dans ` key` ; en d’autres termes, les ensembles contenant les mêmes éléments produisent la même valeur de hachage.
Remarque : cette fonction est « noexcept » lorsque noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)) est true.
[noexcept] size_t qHash(const QString &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[since 6.0] size_t qHash(const QTypeRevision &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[noexcept] size_t qHash(const QUrl &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
size_t qHash(const QVersionNumber &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept] template <typename T> size_t qHash(const T *key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept(...), since 6.12] template <typename T> size_t qHash(const std::optional<T> &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Le type T doit être pris en charge par qHash().
Cela équivaut à
En particulier, si le type « key » est activé (has_value()), la valeur de hachage de key est garantie d’être identique à celle de key.value(), et tous les éléments optionnels désactivés (!has_value()), quel que soit leur type, sont hachés vers la même valeur.
Cette fonction a été introduite dans Qt 6.12.
Remarque : cette fonction est de type « noexcept » lorsque ` QHashPrivate::noexceptPairHash<T, T>() ` est de type ` true`.
Voir également qHash (std::nullopt_t, size_t).
[noexcept(...)] template <typename T1, typename T2> size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Les types T1 et T2 doivent être pris en charge par qHash().
Remarque : cette fonction est de type « noexcept » lorsque QHashPrivate::noexceptPairHash<T1, T2>() est égal à true.
[noexcept] size_t qHash(double key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept] size_t qHash(float key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(int key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(long key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[noexcept] size_t qHash(long double key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept, since 6.8] size_t qHash(qint128 key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Remarque : cette fonction n'est disponible que sur les plateformes prenant en charge un type entier natif de 128 bits.
Cette fonction a été introduite dans Qt 6.8.
[constexpr noexcept] size_t qHash(qint64 key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept, since 6.8] size_t qHash(quint128 key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Remarque : cette fonction n'est disponible que sur les plateformes prenant en charge un type entier natif de 128 bits.
Cette fonction a été introduite dans Qt 6.8.
[constexpr noexcept] size_t qHash(quint64 key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(short key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept] size_t qHash(signed char key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
[constexpr noexcept, since 6.0] size_t qHash(std::nullptr_t key, size_t seed = 0)
Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.
Cette fonction a été introduite dans Qt 6.0.
[noexcept] size_t qHashBits(const void *p, size_t len, size_t seed = 0)
Renvoie la valeur de hachage du bloc de mémoire de taille len pointé par p, en utilisant seed comme graine pour le calcul.
Utilisez cette fonction uniquement pour implémenter la méthode ` qHash()` pour vos propres types personnalisés. Par exemple, voici comment vous pourriez implémenter une surcharge de ` qHash()` pour `std::vector<int>` :
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);
}Cela tire parti du fait que std::vector organise ses données de manière contiguë. Si ce n'est pas le cas, ou si le type contenu comporte un remplissage, vous devez utiliser qHashRange() à la place.
Il convient de rappeler que l’implémentation de `qHashBits()` — à l’instar des surcharges de ` qHash()` proposées par Qt — peut changer à tout moment. Vous ne devez pas vous fier au fait que `qHashBits()` donnera les mêmes résultats (pour les mêmes entrées) d’une version de Qt à l’autre.
Voir également qHashRange() et qHashRangeCommutative().
[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMulti(size_t seed, const T &... args)
Renvoie la valeur de hachage de l'args, en utilisant seed comme graine pour le calcul, en appliquant successivement qHash() à chaque élément et en combinant les valeurs de hachage en une seule.
Notez que l’ordre des arguments est important. Si l’ordre n’a pas d’importance, utilisez plutôt qHashMultiCommutative(). Si vous effectuez un hachage sur de la mémoire brute, utilisez qHashBits() ; si vous effectuez un hachage sur une plage, utilisez qHashRange().
Cette fonction est fournie à titre de commodité pour implémenter ` qHash()` pour vos propres types personnalisés. Par exemple, voici comment vous pourriez implémenter une surcharge de ` qHash()` pour une classe ` Employee` :
#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)
{
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_HCette fonction a été introduite dans Qt 6.0.
Remarque : cette fonction est de type « noexcept » lorsque ` std::conjunction_v<QtPrivate::QNothrowHashable<T>...> ` est de type ` true`.
Voir également ` qHashMultiCommutative ` et ` qHashRange`.
[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMultiCommutative(size_t seed, const T &... args)
Renvoie la valeur de hachage de l'args, en utilisant seed comme graine pour le calcul, en appliquant successivement qHash() à chaque élément et en combinant les valeurs de hachage en une seule.
L'ordre des arguments n'a pas d'importance. Si l'ordre a une importance, utilisez plutôt ` qHashMulti()` car cela peut produire un hachage de meilleure qualité. Si vous effectuez un hachage sur de la mémoire brute, utilisez ` qHashBits()` ; si vous effectuez un hachage sur une plage, utilisez ` qHashRange()`.
Cette fonction est fournie à titre de commodité pour implémenter ` qHash()` pour vos propres types personnalisés.
Cette fonction a été introduite dans Qt 6.0.
Remarque : cette fonction est de type « noexcept » lorsque std::conjunction_v<QtPrivate::QNothrowHashable<T>...> est true.
Voir également qHashMulti et qHashRange.
[noexcept(...)] template <typename InputIterator> size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)
Renvoie la valeur de hachage de l'intervalle [first,last), en utilisant seed comme graine pour le calcul, en appliquant successivement la fonction qHash() à chaque élément et en combinant les valeurs de hachage en une seule.
La valeur renvoyée par cette fonction dépend de l'ordre des éléments dans l'intervalle. Cela signifie que
{0, 1, 2}et
{1, 2, 0}génère des valeurs de hachage différentes. Si l’ordre n’a pas d’importance, par exemple pour les tables de hachage, utilisez plutôt qHashRangeCommutative(). Si vous effectuez un hachage sur de la mémoire brute, utilisez qHashBits().
N’utilisez cette fonction que pour implémenter ` qHash()` pour vos propres types personnalisés. Par exemple, voici comment vous pourriez implémenter une surcharge de ` qHash()` pour `std::vector<int>` :
inline size_t qHash(const std::vector<int> &key, size_t seed = 0)
{
return qHashRange(key.begin(), key.end(), seed);
}Il convient de rappeler que l’implémentation de `qHashRange()` — à l’instar des surcharges de ` qHash()` proposées par Qt — peut changer à tout moment. Vous ne devez pas vous fier au fait que `qHashRange()` donnera les mêmes résultats (pour les mêmes entrées) d’une version de Qt à l’autre, même si ` qHash()` le ferait pour le type d’élément concerné.
Remarque : cette fonction est de type « noexcept » lorsque noexcept(qHash(*first, 0)) est true.
Voir également qHashBits() et qHashRangeCommutative().
[noexcept(...)] template <typename InputIterator> size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)
Renvoie la valeur de hachage de l'intervalle [first,last), en utilisant seed comme graine pour le calcul, en appliquant successivement qHash() à chaque élément et en combinant les valeurs de hachage en une seule.
La valeur renvoyée par cette fonction ne dépend pas de l’ordre des éléments dans l’intervalle. Cela signifie que
{0, 1, 2}et
{1, 2, 0}produisent les mêmes valeurs de hachage. Si l’ordre a de l’importance, par exemple pour les vecteurs et les tableaux, utilisez plutôt qHashRange(). Si vous effectuez un hachage sur de la mémoire brute, utilisez qHashBits().
N’utilisez cette fonction que pour implémenter ` qHash()` pour vos propres types personnalisés. Par exemple, voici comment vous pourriez implémenter une surcharge de ` qHash()` pour `std::unordered_set<int>` :
inline size_t qHash(const std::unordered_set<int> &key, size_t seed = 0)
{
return qHashRangeCommutative(key.begin(), key.end(), seed);
}Il convient de rappeler que l’implémentation de `qHashRangeCommutative()` — à l’instar des surcharges de ` qHash()` proposées par Qt — peut changer à tout moment. Vous ne devez pas partir du principe que qHashRangeCommutative() donnera les mêmes résultats (pour les mêmes entrées) d'une version de Qt à l'autre, même si qHash() pour le type d'élément le ferait.
Remarque : cette fonction est de type « noexcept » lorsque noexcept(qHash(*first, 0)) est de type « true ».
Voir également qHashBits() et qHashRange().
[noexcept] bool operator!=(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
Renvoie true si le hachage de lhs n'est pas égal à celui de rhs; sinon, renvoie false.
Deux hachages sont considérés comme égaux s’ils contiennent les mêmes paires (clé, valeur).
Cette fonction nécessite que le type de valeur implémente la méthode ` operator==()`.
Voir également operator==().
template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QHash<Key, T> &hash)
Écrit le hachage hash dans le flux out.
Cette fonction nécessite que les types de clé et de valeur implémentent l'operator<<().
Voir également Sérialisation des types de données Qt.
[noexcept] bool operator==(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
Renvoie « true » si le hachage de lhs est égal à celui de rhs; sinon, renvoie « false ».
Deux hachages sont considérés comme égaux s’ils contiennent les mêmes paires (clé, valeur).
Cette fonction nécessite que le type de valeur implémente operator==().
Voir également operator!=().
template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)
Lit un hachage à partir du flux in et l'enregistre dans hash.
Cette fonction nécessite que les types de clé et de valeur implémentent l'interface operator>>().
Voir également Sérialisation des types de données Qt.
Documentation sur les macros
[since 6.11] QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD
La définition de cette macro désactive la prise en charge des surcharges de ` qHash ` qui ne prennent qu'un seul argument ; en d'autres termes, des surcharges de ` qHash ` qui n'acceptent pas également une graine. La prise en charge des surcharges à argument unique de ` qHash ` est obsolète et sera supprimée dans Qt 7.
Cette macro a été introduite dans Qt 6.11.
Voir également qHash.
© 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.