QHash Class
template <typename Key, typename T> class QHashLa clase QHash es una clase de plantilla que proporciona un diccionario basado en tablas hash. Más...
| Cabecera: | #include <QHash> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- Lista de todos los miembros, incluidos los heredados
- Miembros obsoletos
- QHash es parte de Clases Implícitamente Compartidas.
Esta clase es igualdad-comparable.
Nota: Todas las funciones de esta clase son reentrantes.
Tipos Públicos
(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 |
Funciones Públicas
| 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 |
No miembros relacionados
(since 6.1) qsizetype | erase_if(QHash<Key, T> &hash, Predicate pred) |
(since 6.5) size_t | qHash(Enum clave, size_t semilla = 0) |
| size_t | qHash(const QStringRef &key, size_t seed = 0) |
| size_t | qHash(const QMqttTopicFilter &filter, size_t seed = 0) |
| size_t | qHash(QSslEllipticCurve key, size_t seed = 0) |
| size_t | qHash(const QGeoCoordinate &coordinate, size_t seed = 0) |
(since 6.0) size_t | qHash(QByteArrayView clave, size_t semilla = 0) |
| size_t | qHash(const QMqttTopicName &name, size_t seed = 0) |
| size_t | qHash(const QOcspResponse &key, size_t seed = 0) |
| size_t | qHash(uint key, size_t seed = 0) |
| size_t | qHash(ulong key, size_t seed = 0) |
| tamaño_t | qHash(ushort clave, size_t semilla = 0) |
(since 6.0) tamaño_t | qHash( clave wchar_t, tamaño_t semilla = 0) |
| size_t | qHash(QDate clave, size_t semilla = 0) |
| size_t | qHash(const QSslCertificate &key, size_t seed = 0) |
| size_t | qHash(QLatin1StringView clave, size_t semilla = 0) |
| size_t | qHash(const QSslError &key, size_t seed = 0) |
(since 6.0) size_t | qHash(QPoint clave, size_t semilla = 0) |
| size_t | qHash(QTime clave, size_t semilla = 0) |
(since 6.9) size_t | qHash(T clave, size_t semilla) |
| size_t | qHash(char clave, size_t semilla = 0) |
(since 6.0) size_t | qHash(char16_t clave, size_t semilla = 0) |
(since 6.0) tamaño_t | qHash(char32_t clave, size_t semilla = 0) |
(since 6.0) tamaño_t | qHash(char8_t clave, size_t semilla = 0) |
| size_t | qHash(const QBitArray &key, size_t semilla = 0) |
| size_t | qHash(const QByteArray &key, size_t semilla = 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 semilla = 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) |
| size_t | qHash(const std::pair<T1, T2> &key, size_t seed = 0) |
| tamaño_t | qHash(double key, size_t seed = 0) |
| size_t | qHash( clave float, semilla size_t = 0) |
| tamaño_t | qHash(int clave, size_t semilla = 0) |
| size_t | qHash( clave long, semilla size_t = 0) |
| size_t | qHash( clave doble long, semilla size_t = 0) |
(since 6.8) size_t | qHash(qint128 clave, size_t semilla = 0) |
| size_t | qHash(qint64 clave, size_t semilla = 0) |
(since 6.8) size_t | qHash(quint128 clave, size_t semilla = 0) |
| size_t | qHash(quint64 clave, size_t semilla = 0) |
| size_t | qHash( clave corta, semilla size_t = 0) |
| size_t | qHash(signed char key, size_t seed = 0) |
(since 6.0) size_t | qHash(std::nullptr_t clave, size_t semilla = 0) |
| size_t | qHash(uchar clave, size_t semilla = 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 semilla, const T &... args) |
| size_t | qHashRange(InputIterator primero, InputIterator último, size_t semilla = 0) |
| size_t | qHashRangeCommutative(InputIterator primero, InputIterator último, size_t semilla = 0) |
| bool | operator!=(const QHash<Clave, T> &lhs, const QHash<Clave, T> &rhs) |
| QDataStream & | operator<<(QDataStream &out, const QHash<Key, T> &hash) |
| bool | operator==(const QHash<Clave, T> &lhs, const QHash<Clave, T> &rhs) |
| QDataStream & | operator>>(QDataStream &in, QHash<Key, T> &hash) |
Macros
(since 6.11) | QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD |
Descripción detallada
QHash<Key, T> es una de las clases contenedoras genéricas de Qt. Almacena pares (clave, valor) y proporciona una búsqueda muy rápida del valor asociado a una clave.
QHash proporciona una funcionalidad muy similar a QMap. Las diferencias son:
- QHash proporciona búsquedas más rápidas que QMap(para más detalles, véase Complejidad algorítmica ).
- Al iterar sobre QMap, los elementos siempre se ordenan por clave. Con QHash, los elementos se ordenan arbitrariamente.
- El tipo de clave de QMap debe proporcionar operator<(). El tipo de clave de un QHash debe proporcionar operator==() y una función hash global llamada qHash() (véase qHash).
He aquí un ejemplo de QHash con QString claves y int valores:
Para insertar un par (clave, valor) en el hash, se puede utilizar operator[]():
hash["one"] = 1; hash["three"] = 3; hash["seven"] = 7;
Esto inserta los siguientes tres pares (clave, valor) en el QHash: ("uno", 1), ("tres", 3), y ("siete", 7). Otra forma de insertar elementos en el hash es utilizar insert():
hash.insert("twelve", 12);
Para buscar un valor, utilice operator[]() o value():
int num1 = hash["thirteen"]; int num2 = hash.value("thirteen");
Si no hay ningún elemento con la clave especificada en el hash, estas funciones devuelven un valor construido por defecto.
Si desea comprobar si el hash contiene una clave concreta, utilice contains():
int timeout = 30; if (hash.contains("TIMEOUT")) timeout = hash.value("TIMEOUT");
También existe una sobrecarga de value() que utiliza su segundo argumento como valor por defecto si no hay ningún elemento con la clave especificada:
int timeout = hash.value("TIMEOUT", 30);
En general, se recomienda utilizar contains() y value() en lugar de operator[]() para buscar una clave en un hash. La razón es que operator[]() inserta silenciosamente un elemento en el hash si no existe ningún elemento con la misma clave (a menos que el hash sea const). Por ejemplo, el siguiente fragmento de código creará 1000 elementos en memoria:
// WRONG QHash<int, QWidget *> hash; //... for (int i = 0; i < 1000; ++i) { if (hash[i] == okButton) cout << "Found button at index " << i << endl; }
Para evitar este problema, sustituya hash[i] por hash.value(i) en el código anterior.
Internamente, QHash utiliza una tabla hash para realizar búsquedas. Esta tabla hash crece automáticamente para proporcionar búsquedas rápidas sin gastar demasiada memoria. Aún puedes controlar el tamaño de la tabla hash llamando a reserve() si ya sabes aproximadamente cuántos elementos contendrá el QHash, pero esto no es necesario para obtener un buen rendimiento. También puedes llamar a capacity() para obtener el tamaño de la tabla hash.
QHash no se reducirá automáticamente si se eliminan elementos de la tabla. Para minimizar la memoria utilizada por el hash, llame a squeeze().
Para recorrer todos los pares (clave, valor) almacenados en un QHash, utilice asKeyValueRange():
for (const auto &[key, value] : std::as_const(hash).asKeyValueRange()) cout << qPrintable(key) << ": " << value << endl;
Esta función devuelve un objeto de rango que puede utilizarse con enlaces estructurados. Para el control manual de los iteradores, también puede utilizar los iteradores tradicionales de estilo STL (QHash::const_iterator y QHash::iterator):
for (auto it = hash.cbegin(); it != hash.cend(); ++it) cout << qPrintable(it.key()) << ": " << it.value() << endl;
Para modificar valores, utilice iteradores:
for (auto it = hash.begin(); it != hash.end(); ++it) it.value() += 1;
QHash también proporciona iteradores al estilo Java (QHashIterator y QMutableHashIterator) por compatibilidad.
QHash no está ordenado, por lo que no se puede asumir que la secuencia de un iterador sea predecible. Si se requiere ordenar por clave, utilice un QMap.
Un QHash sólo permite un valor por clave. Si se llama a insert() con una clave que ya existe en el QHash, se borra el valor anterior. Por ejemplo:
hash.insert("plenty", 100); hash.insert("plenty", 2000); // hash.value("plenty") == 2000
Si necesita almacenar varias entradas para la misma clave en la tabla hash, utilice QMultiHash.
Si sólo necesita extraer los valores de un hash (no las claves), también puede utilizar range-based for:
Los elementos se pueden eliminar del hash de varias maneras. Una forma es llamar a remove(); esto eliminará cualquier elemento con la clave dada. Otra forma es utilizar QMutableHashIterator::remove(). Además, puede borrar todo el hash utilizando clear().
Los tipos de datos clave y valor de QHash deben ser tipos de datos asignables. No puedes, por ejemplo, almacenar un QWidget como valor; en su lugar, almacena un QWidget *.
La función hash
El tipo de clave de un QHash tiene requisitos adicionales aparte de ser un tipo de datos asignable: debe proporcionar operator==(), y también debe haber una función hash que devuelva un valor hash para un argumento del tipo de la clave.
La función hash calcula un valor numérico a partir de una clave. Puede utilizar cualquier algoritmo imaginable, siempre que devuelva siempre el mismo valor si se le da el mismo argumento. En otras palabras, si e1 == e2, entonces hash(e1) == hash(e2) también debe valer. Sin embargo, para obtener un buen rendimiento, la función hash debe intentar devolver diferentes valores hash para diferentes claves en la mayor medida posible.
Una función hash para un tipo de clave K puede proporcionarse de dos maneras diferentes.
La primera es mediante una sobrecarga de qHash() en el espacio de nombres de K. La función qHash() debe tener una de estas firmas:
size_t qHash(K clave, size_t semilla);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
Las sobrecargas de dos argumentos toman un entero sin signo que debe usarse para sembrar el cálculo de la función hash. Esta semilla es proporcionada por QHash para evitar una familia de algorithmic complexity attacks.
Nota: En Qt 6 es posible definir una sobrecarga qHash() que tome un solo argumento; el soporte para esto está obsoleto. A partir de Qt 7, será obligatorio usar una sobrecarga de dos argumentos. Si se definen tanto una sobrecarga de un argumento como una de dos argumentos para un tipo de clave, QHash utilizará esta última (ten en cuenta que puedes simplemente definir una versión de dos argumentos, y utilizar un valor por defecto para el parámetro semilla). En Qt 6 es posible deshabilitar el soporte para la sobrecarga qHash de un solo argumento definiendo la macro QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD.
La segunda forma de proporcionar una función hash es especializando la clase std::hash para el tipo de clave K, y proporcionando un operador de llamada a función adecuado para ello:
namespace std { template <> struct hash<K> { // seed is optional size_t operator()(const K &key, size_t seed = 0) const; }; }
El argumento semilla tiene el mismo significado que para qHash(), y puede omitirse.
Esta segunda forma permite reutilizar la misma función hash entre QHash y los contenedores asociativos desordenados de la biblioteca estándar de C++. Si se proporcionan tanto una sobrecarga qHash() como una especialización std::hash para un tipo, entonces se prefiere la sobrecarga qHash().
Esta es una lista parcial de los tipos C++ y Qt que pueden servir como claves en un QHash: cualquier tipo entero (char, unsigned long, etc.), cualquier tipo puntero, QChar, QString, y QByteArray. Para todos ellos, la cabecera <QHash> define una función qHash() que calcula un valor hash adecuado. Muchas otras clases Qt también declaran una sobrecarga qHash para su tipo; consulte la documentación de cada clase.
Si desea utilizar otros tipos como clave, asegúrese de proporcionar operator==() y una implementación hash.
La función de conveniencia qHashMulti() se puede utilizar para implementar qHash() para un tipo personalizado, donde uno normalmente quiere producir un valor hash a partir de múltiples campos:
Ejemplo:
#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_H
En el ejemplo anterior, hemos confiado en la propia implementación de Qt de qHash() para que QString y QDate nos proporcionen un valor hash para el nombre y la fecha de nacimiento del empleado, respectivamente.
Ten en cuenta que la implementación de las sobrecargas de qHash() que ofrece Qt puede cambiar en cualquier momento. No debes confiar en que qHash() dará los mismos resultados (para las mismas entradas) en diferentes versiones de Qt.
Ataques de complejidad algorítmica
Todas las tablas hash son vulnerables a una clase particular de ataques de denegación de servicio, en los que el atacante precalcula cuidadosamente un conjunto de claves diferentes que se van a hashear en el mismo bucket de una tabla hash (o incluso tienen el mismo valor hash). El objetivo del ataque es obtener el peor comportamiento algorítmico (O(n) en lugar de O(1) amortizado, véase Complejidad algorítmica para más detalles) cuando los datos se introducen en la tabla.
Para evitar este comportamiento en el peor de los casos, el cálculo del valor hash realizado por qHash() puede ser salado por una semilla aleatoria, que anula el alcance del ataque. Esta semilla es generada automáticamente por QHash una vez por proceso, y luego pasada por QHash como el segundo argumento de la sobrecarga de dos argumentos de la función qHash().
Esta aleatorización de QHash está activada por defecto. Aunque los programas nunca deberían depender de un orden particular de QHash, puede haber situaciones en las que temporalmente necesites un comportamiento determinista, por ejemplo para depuración o pruebas de regresión. Para desactivar la aleatorización, defina la variable de entorno QT_HASH_SEED para que tenga el valor 0. Alternativamente, puede llamar a la función QHashSeed::setDeterministicGlobalSeed().
Véase también QHashIterator, QMutableHashIterator, QMap, y QSet.
Documentación de tipos de miembros
QHash::ConstIterator
Qt-style sinónimo de QHash::const_iterator.
QHash::Iterator
Qt-style sinónimo de QHash::iterator.
QHash::const_key_value_iterator
El tippedef QHash::const_key_value_iterator proporciona un iterador const de estilo STL para QHash.
QHash::const_key_value_iterator es esencialmente lo mismo que QHash::const_iterator con la diferencia de que operator*() devuelve un par clave/valor en lugar de un valor.
Véase también QKeyValueIterator.
[alias] QHash::difference_type
Typedef para ptrdiff_t. Proporcionado para la compatibilidad STL.
[alias] QHash::key_type
Typedef para Key. Se proporciona por compatibilidad con STL.
QHash::key_value_iterator
El tippedef QHash::key_value_iterator proporciona un iterador estilo STL para QHash.
QHash::key_value_iterator es esencialmente lo mismo que QHash::iterator con la diferencia de que operator*() devuelve un par clave/valor en lugar de un valor.
Véase también QKeyValueIterator.
[alias] QHash::mapped_type
Typedef para T. Proporcionado por compatibilidad con STL.
[alias] QHash::size_type
Typedef para int. Se proporciona por compatibilidad con la STL.
Documentación de funciones miembro
[noexcept] QHash::QHash()
Construye un hash vacío.
Véase también clear().
QHash::QHash(std::initializer_list<std::pair<Key, T>> list)
Construye un hash con una copia de cada uno de los elementos de la lista inicializadora list.
template <typename InputIterator> QHash::QHash(InputIterator begin, InputIterator end)
Construye un hash con una copia de cada uno de los elementos del rango del iterador [begin, end). O bien los elementos iterados por el rango deben ser objetos con miembros de datos first y second (como std::pair), convertibles a Key y a T respectivamente; o bien los iteradores deben tener funciones miembro key() y value(), devolviendo una clave convertible a Key y un valor convertible a T respectivamente.
[noexcept] QHash::QHash(const QHash<Key, T> &other)
Construye una copia de other.
Esta operación ocurre en tiempo constante, porque QHash es implícitamente compartido. Esto hace que devolver un QHash desde una función sea muy rápido. Si una instancia compartida es modificada, será copiada (copy-on-write), y esto toma tiempo lineal.
Véase también operator=().
[noexcept] QHash::QHash(QHash<Key, T> &&other)
Move-construye una instancia de QHash, haciendo que apunte al mismo objeto al que apuntaba other.
QHash::~QHash()
Destruye el hash. Las referencias a los valores del hash y todos los iteradores de este hash pierden su validez.
[since 6.4] auto QHash::asKeyValueRange() &
[since 6.4] auto QHash::asKeyValueRange() const &
[since 6.4] auto QHash::asKeyValueRange() &&
[since 6.4] auto QHash::asKeyValueRange() const &&
Devuelve un objeto de rango que permite iterar sobre este hash como pares clave/valor. Por ejemplo, este objeto de rango se puede utilizar en un bucle for basado en rangos, en combinación con una declaración de enlace estructurada:
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 }
Tenga en cuenta que tanto la clave como el valor obtenidos de esta forma son referencias a los del hash. Específicamente, al mutar el valor se modificará el propio hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Estas funciones se introdujeron en Qt 6.4.
Véase también QKeyValueIterator.
QHash<Key, T>::iterator QHash::begin()
Devuelve un iterador de estilo STL que apunta al primer elemento del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también constBegin() y end().
[noexcept] QHash<Key, T>::const_iterator QHash::begin() const
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Esta es una función sobrecargada.
[noexcept] qsizetype QHash::capacity() const
Devuelve el número de cubos de la tabla hash interna de QHash.
El único propósito de esta función es proporcionar un medio para ajustar el uso de memoria de QHash. En general, rara vez necesitará llamar a esta función. Si desea saber cuántos elementos hay en el hash, llame a size().
Véase también reserve() y squeeze().
[noexcept] QHash<Key, T>::const_iterator QHash::cbegin() const
Devuelve un iterador const de estilo STL que apunta al primer elemento del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también begin() y cend().
[noexcept] QHash<Key, T>::const_iterator QHash::cend() const
Devuelve un iterador const de estilo STL que apunta al elemento imaginario después del último elemento del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también cbegin() y end().
[noexcept(...)] void QHash::clear()
Elimina todos los elementos del hash y libera toda la memoria utilizada por él.
Nota: Esta función es noexcept cuando std::is_nothrow_destructible<Node>::value es true.
Véase también remove().
[noexcept] QHash<Key, T>::const_iterator QHash::constBegin() const
Devuelve un iterador const de estilo STL que apunta al primer elemento del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también begin() y constEnd().
[noexcept] QHash<Key, T>::const_iterator QHash::constEnd() const
Devuelve un iterador const de estilo STL que apunta al elemento imaginario después del último elemento del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también constBegin() y end().
[noexcept] QHash<Key, T>::const_iterator QHash::constFind(const Key &key) const
Devuelve un iterador que apunta al elemento con el key en el hash.
Si el hash no contiene ningún elemento con key, la función devuelve constEnd().
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también find().
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueBegin() const
Devuelve un iterador const de estilo STL que apunta a la primera entrada del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyValueBegin().
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueEnd() const
Devuelve un iterador const de estilo STL que apunta a la entrada imaginaria después de la última entrada del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también constKeyValueBegin().
[noexcept] bool QHash::contains(const Key &key) const
Devuelve true si el hash contiene un elemento con la key; en caso contrario devuelve false.
Véase también count().
[noexcept] qsizetype QHash::count(const Key &key) const
Devuelve el número de elementos asociados a key.
Véase también contains().
[noexcept] qsizetype QHash::count() const
Igual que size().
Se trata de una función sobrecargada.
template <typename... Args> QHash<Key, T>::iterator QHash::emplace(const Key &key, Args &&... args)
template <typename... Args> QHash<Key, T>::iterator QHash::emplace(Key &&key, Args &&... args)
Inserta un nuevo elemento en el contenedor. Este nuevo elemento se construye in situ utilizando args como argumentos para su construcción.
Devuelve un iterador que apunta al nuevo elemento.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
[noexcept] bool QHash::empty() const
Esta función se proporciona por compatibilidad con la STL. Es equivalente a isEmpty(), devolviendo true si el hash está vacío; en caso contrario devuelve false.
[noexcept] QHash<Key, T>::iterator QHash::end()
Devuelve un iterador estilo STL que apunta al elemento imaginario después del último elemento del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también begin() y constEnd().
[noexcept] QHash<Key, T>::const_iterator QHash::end() const
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Esta es una función sobrecargada.
QHash<Key, T>::iterator QHash::erase(QHash<Key, T>::const_iterator pos)
Elimina el par (clave, valor) asociado con el iterador pos del hash, y devuelve un iterador al siguiente elemento del hash.
Esta función nunca hace que QHash rehaga su estructura de datos interna. Esto significa que puede ser llamada con seguridad mientras se itera, y no afectará al orden de los elementos en el hash. Por ejemplo:
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; } }
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también remove(), take(), y find().
QHash<Key, T>::iterator QHash::find(const Key &key)
Devuelve un iterador que apunta al elemento con el key en el hash.
Si el hash no contiene ningún elemento con el key, la función devuelve end().
Si el hash contiene múltiples elementos con el key, esta función devuelve un iterador que apunta al valor insertado más recientemente. Los otros valores son accesibles incrementando el iterador. Por ejemplo, aquí hay algo de código que itera sobre todos los elementos con la misma clave:
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; }
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también value() y values().
[noexcept] QHash<Key, T>::const_iterator QHash::find(const Key &key) const
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Esta es una función sobrecargada.
void QHash::insert(const QHash<Key, T> &other)
Inserta todos los elementos del hash other en este hash.
Si una clave es común a ambos hashes, su valor se sustituirá por el valor almacenado en other.
QHash<Key, T>::iterator QHash::insert(const Key &key, const T &value)
Inserta un nuevo elemento con el key y un valor de value.
Si ya existe un elemento con el valor key, el valor de ese elemento se sustituye por value.
Devuelve un iterador que apunta al elemento nuevo/actualizado.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
[since 6.11] QHash<Key, T>::iterator QHash::insert(const 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(Key &&key, T &&value)
Estas funciones se introdujeron en Qt 6.11.
[since 6.9] template <typename Value> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(const Key &key, Value &&value)
[since 6.9] template <typename Value> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(Key &&key, Value &&value)
[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)
Intenta insertar un elemento con los valores key y value. Si ya existe un elemento con key, su valor se sobrescribe con value.
Devuelve una instancia de TryEmplaceResult, una estructura que contiene un iterator al elemento, y un booleano, inserted, que denota si el elemento fue creado recientemente (true) o si existía previamente (false).
Estas funciones se introdujeron en Qt 6.9.
Véase también insert(), tryEmplace(), y tryInsert().
[since 6.9] template <typename Value> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(const Key &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 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)
Intenta insertar un elemento con los valores key y value. Si ya existe un elemento con key su valor se sobrescribe con value.
Devuelve un par formado por un iterador que apunta al elemento y un booleano que indica si el elemento se ha creado recientemente (true) o si ya existía (false).
Estas funciones se proporcionan por compatibilidad con la biblioteca estándar.
Estas funciones se introdujeron en Qt 6.9.
Véase también insert(), tryEmplace(), tryInsert(), y insertOrAssign().
[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)
[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 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)
Intenta insertar un elemento con los valores key y value. Si ya existe un elemento con key su valor se sobrescribe con value.
Devuelve un par formado por un iterador que apunta al elemento y un booleano que indica si el elemento se ha creado recientemente (true) o si ya existía (false).
hint se ignora.
Estas funciones se proporcionan por compatibilidad con la biblioteca estándar.
Estas funciones se introdujeron en Qt 6.9.
Véase también insert(), tryEmplace(), y insertOrAssign().
[noexcept] bool QHash::isEmpty() const
Devuelve true si el hash no contiene elementos; en caso contrario devuelve false.
Véase también size().
[noexcept] Key QHash::key(const T &value) const
[noexcept] Key QHash::key(const T &value, const Key &defaultKey) const
Devuelve la primera clave asignada a value. Si el hash no contiene ningún elemento asignado a value, devuelve defaultKey, o una clave construida por defecto si no se ha proporcionado este parámetro.
Esta función puede ser lenta(tiempo lineal), porque la estructura de datos interna de QHash está optimizada para una búsqueda rápida por clave, no por valor.
[noexcept] QHash<Key, T>::key_iterator QHash::keyBegin() const
Devuelve un iterador const de estilo STL que apunta a la primera clave del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyEnd().
[noexcept] QHash<Key, T>::key_iterator QHash::keyEnd() const
Devuelve un iterador const de estilo STL que apunta al elemento imaginario después de la última clave del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyBegin().
QHash<Key, T>::key_value_iterator QHash::keyValueBegin()
Devuelve un iterador estilo STL que apunta a la primera entrada del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyValueEnd().
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueBegin() const
Devuelve un iterador const de estilo STL que apunta a la primera entrada del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyValueEnd().
QHash<Key, T>::key_value_iterator QHash::keyValueEnd()
Devuelve un iterador estilo STL que apunta a la entrada imaginaria después de la última entrada en el hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyValueBegin().
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueEnd() const
Devuelve un iterador const de estilo STL que apunta a la entrada imaginaria después de la última entrada del hash.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también keyValueBegin().
QList<Key> QHash::keys() const
Devuelve una lista que contiene todas las claves del hash, en un orden arbitrario.
Se garantiza que el orden sea el mismo que el utilizado por values().
Esta función crea una nueva lista, en tiempo lineal. El uso de tiempo y memoria que ello conlleva puede evitarse iterando desde keyBegin() hasta keyEnd().
Véase también values() y key().
QList<Key> QHash::keys(const T &value) const
Devuelve una lista que contiene todas las claves asociadas al valor value, en un orden arbitrario.
Esta función puede ser lenta(tiempo lineal), porque la estructura de datos interna de QHash está optimizada para una búsqueda rápida por clave, no por valor.
Se trata de una función sobrecargada.
[noexcept] float QHash::load_factor() const
Devuelve el factor de carga actual de la tabla hash interna de QHash. Es lo mismo que capacity()/size(). La implementación utilizada intentará mantener el factor de carga entre 0.25 y 0.5. De este modo se evitan demasiadas colisiones en la tabla hash, lo que reduciría el rendimiento.
Incluso con un factor de carga bajo, la implementación de la tabla hash tiene una sobrecarga de memoria muy baja.
Este método sólo existe para fines de diagnóstico y rara vez debería necesitar llamarlo usted mismo.
Véase también reserve() y squeeze().
bool QHash::remove(const Key &key)
Elimina del hash el elemento que tiene la clave key. Devuelve true si la clave existe en el hash y el elemento ha sido eliminado, y false en caso contrario.
Véase también clear() y take().
[since 6.1] template <typename Predicate> qsizetype QHash::removeIf(Predicate pred)
Elimina del hash todos los elementos para los que el predicado pred devuelve verdadero.
La función admite predicados que toman un argumento de tipo QHash<Key, T>::iterator, o un argumento de tipo std::pair<const Key &, T &>.
Devuelve el número de elementos eliminados, si los hay.
Esta función se introdujo en Qt 6.1.
Véase también clear() y take().
void QHash::reserve(qsizetype size)
Asegura que la tabla hash interna de QHash tiene espacio para almacenar al menos size elementos sin tener que hacer crecer la tabla hash.
Esto implica que la tabla hash contendrá al menos 2 * size buckets para asegurar un buen rendimiento.
Esta función es útil para código que necesita construir un hash enorme y quiere evitar reasignaciones repetidas. Por ejemplo:
QHash<QString, int> hash; hash.reserve(20000); for (int i = 0; i < 20000; ++i) hash.insert(keys[i], values[i]);
Idealmente, size debería ser el número máximo de elementos esperados en el hash. QHash elegirá entonces el menor número posible de cubos que permita almacenar size elementos en la tabla sin tener que hacer crecer la tabla hash interna. Si size es una subestimación, lo peor que ocurrirá es que QHash será un poco más lento.
En general, rara vez necesitarás llamar a esta función. QHash La tabla hash interna de crece automáticamente para proporcionar un buen rendimiento sin desperdiciar demasiada memoria.
Véase también squeeze() y capacity().
[noexcept] qsizetype QHash::size() const
Devuelve el número de elementos del hash.
Véase también isEmpty() y count().
void QHash::squeeze()
Reduce el tamaño de la tabla hash interna de QHash para ahorrar memoria.
El único propósito de esta función es proporcionar un medio para afinar el uso de memoria de QHash. En general, rara vez necesitará llamar a esta función.
Véase también reserve() y capacity().
[noexcept] void QHash::swap(QHash<Key, T> &other)
Intercambia este hash con other. Esta operación es muy rápida y nunca falla.
T QHash::take(const Key &key)
Elimina el elemento con key del hash y devuelve el valor asociado a él.
Si el elemento no existe en el hash, la función simplemente devuelve un valor construido por defecto.
Si no utiliza el valor devuelto, remove() es más eficiente.
Véase también remove().
[since 6.9] template <typename... Args> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(const Key &key, Args &&... args)
[since 6.9] template <typename... Args> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(Key &&key, 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)
Inserta un nuevo elemento con key y un valor construido a partir de args. Si ya existe un elemento con key, no se realiza la inserción.
Devuelve una instancia de TryEmplaceResult, una estructura que contiene un iterator al elemento recién creado, o al elemento preexistente que impidió la inserción, y un booleano, inserted, que denota si la inserción tuvo lugar.
Esto puede utilizarse, por ejemplo, para evitar el patrón de comparación entre el tamaño antiguo y el nuevo o las búsquedas dobles. Donde antes podría haber escrito código como:
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...]
En su lugar puede escribir:
QHash<int, MyType> hash; // [...] int myKey = getKey(); auto result = hash.tryEmplace(myKey); if (result.inserted) // New element! initialize(*result.iterator); // [use result.iterator...]
Estas funciones se introdujeron en Qt 6.9.
Véase también emplace(), tryInsert(), y insertOrAssign().
[since 6.9] QHash<Key, T>::TryEmplaceResult QHash::tryInsert(const Key &key, const T &value)
[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)
Inserta un nuevo elemento con key y un valor de value. Si ya existe un elemento con key, no se realiza la inserción.
Devuelve una instancia de TryEmplaceResult, una estructura que contiene un iterator al elemento recién creado, o al elemento preexistente que impidió la inserción, y un booleano, inserted, que denota si la inserción tuvo lugar.
Estas funciones se introdujeron en Qt 6.9.
Véase también insert(), tryEmplace() y insertOrAssign().
[since 6.9] template <typename... Args> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(const Key &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 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)
Inserta un nuevo elemento con key y un valor construido a partir de args. Si ya existe un elemento con key, no se realiza la inserción.
Devuelve un par formado por un iterador al elemento insertado (o al elemento que impidió la inserción), y un bool que denota si la inserción tuvo lugar.
Estas funciones se proporcionan por compatibilidad con la biblioteca estándar.
Estas funciones se introdujeron en Qt 6.9.
Véase también emplace(), tryEmplace(), tryInsert() y 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, const 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, Key &&key, Args &&... args)
Inserta un nuevo elemento con key y un valor construido a partir de args. Si ya existe un elemento con key, no se realiza la inserción.
Devuelve el iterador del elemento insertado, o al elemento que impidió la inserción.
hint se ignora.
Estas funciones se proporcionan por compatibilidad con la biblioteca estándar.
Estas funciones se introdujeron en Qt 6.9.
Véase también emplace(), tryEmplace(), tryInsert(), y insertOrAssign().
[noexcept] T QHash::value(const Key &key) const
[noexcept] T QHash::value(const Key &key, const T &defaultValue) const
Devuelve el valor asociado a key.
Si el hash no contiene ningún elemento con el key, la función devuelve defaultValue, o un valor construido por defecto si no se ha suministrado este parámetro.
QList<T> QHash::values() const
Devuelve una lista que contiene todos los valores del hash, en un orden arbitrario.
Se garantiza que el orden sea el mismo que el utilizado por keys().
Esta función crea una nueva lista, en tiempo lineal. El uso de tiempo y memoria que conlleva puede evitarse iterando de keyValueBegin() a keyValueEnd().
Véase también keys() y value().
[noexcept] QHash<Key, T> &QHash::operator=(QHash<Key, T> &&other)
Mover-asigna other a esta instancia QHash.
[noexcept(...)] QHash<Key, T> &QHash::operator=(const QHash<Key, T> &other)
Asigna other a este hash y devuelve una referencia a este hash.
Nota: Esta función es noexcept cuando std::is_nothrow_destructible<Node>::value es true.
T &QHash::operator[](const Key &key)
Devuelve el valor asociado a key como referencia modificable.
Si el hash no contiene ningún elemento con el key, la función inserta un valor construido por defecto en el hash con el key, y devuelve una referencia al mismo.
Advertencia: Los iteradores/referencias devueltos deben considerarse invalidados la próxima vez que se llame a una función no-const sobre el hash, o cuando se destruya el hash.
Véase también insert() y value().
[noexcept] const T QHash::operator[](const Key &key) const
Igual que value().
Se trata de una función sobrecargada.
No miembros relacionados
[since 6.1] template <
typename Key,
typename T,
typename Predicate
>
qsizetype erase_if(QHash<Key, T> &hash, Predicate pred)
Elimina del hash hash todos los elementos para los que el predicado pred devuelve verdadero.
La función admite predicados que toman un argumento de tipo QHash<Key, T>::iterator, o un argumento de tipo std::pair<const Key &, T &>.
Devuelve el número de elementos eliminados, si los hay.
Esta función se introdujo en 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)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Nota: Antes de Qt 6.5, los enums sin ámbito dependían de las sobrecargas de enteros de esta función debido a la conversión implícita a sus tipos enteros subyacentes. Para los enums con ámbito, había que implementar una sobrecarga. Esta sigue siendo la solución compatible con versiones anteriores de Qt.
Esta función se introdujo en Qt 6.5.
[noexcept, since 6.0] size_t qHash(QByteArrayView key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[constexpr noexcept] size_t qHash(uint key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(ulong key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(ushort key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept, since 6.0] size_t qHash(wchar_t key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[noexcept] size_t qHash(QDate key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept] size_t qHash(QLatin1StringView key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept, since 6.0] size_t qHash(QPoint key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[noexcept] size_t qHash(QTime key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[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)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Nota: Esto es qHash(bool), restringido para aceptar sólo argumentos de tipo bool, no argumentos de tipos que simplemente se convierten a bool.
Nota: En versiones de Qt anteriores a la 6.9, esta sobrecarga era proporcionada involuntariamente por una función de plantilla adaptadora qHash de 1 a 2 argumentos no documentada, con idéntico comportamiento.
Esta función se introdujo en Qt 6.9.
[constexpr noexcept] size_t qHash(char key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept, since 6.0] size_t qHash(char16_t key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[constexpr noexcept, since 6.0] size_t qHash(char32_t key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[constexpr noexcept, since 6.0] size_t qHash(char8_t key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[noexcept] size_t qHash(const QBitArray &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept] size_t qHash(const QByteArray &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(const QChar key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
size_t qHash(const QDateTime &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept(...)] template <typename Key, typename T> size_t qHash(const QHash<Key, T> &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
Los tipos Key y T deben ser soportados por qHash().
Nota: Esta función es noexcept cuando noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())) es true.
[noexcept(...)] template <typename T> size_t qHash(const QSet<T> &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
El tipo T debe ser compatible con qHash().
El valor hash es independiente del orden de los elementos en key, es decir, los conjuntos que contienen los mismos elementos tienen el mismo valor hash.
Nota: Esta función es noexcept cuando noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)) es true.
[noexcept] size_t qHash(const QString &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[since 6.0] size_t qHash(const QTypeRevision &key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[noexcept] size_t qHash(const QUrl &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
size_t qHash(const QVersionNumber &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept] template <typename T> size_t qHash(const T *key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept(...)] template <typename T1, typename T2> size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
Los tipos T1 y T2 deben ser soportados por qHash().
Nota: Esta función es noexcept cuando QHashPrivate::noexceptPairHash<T1, T2>() es true.
[noexcept] size_t qHash(double key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept] size_t qHash(float key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(int key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(long key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept] size_t qHash(long double key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept, since 6.8] size_t qHash(qint128 key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
Nota: Esta función sólo está disponible en plataformas que soporten un tipo entero nativo de 128 bits.
Esta función se introdujo en Qt 6.8.
[constexpr noexcept] size_t qHash(qint64 key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept, since 6.8] size_t qHash(quint128 key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
Nota: Esta función sólo está disponible en plataformas que soporten un tipo entero nativo de 128 bits.
Esta función se introdujo en Qt 6.8.
[constexpr noexcept] size_t qHash(quint64 key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(short key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept] size_t qHash(signed char key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[constexpr noexcept, since 6.0] size_t qHash(std::nullptr_t key, size_t seed = 0)
Devuelve el valor hash para key, usando seed para sembrar el cálculo.
Esta función se introdujo en Qt 6.0.
[constexpr noexcept] size_t qHash(uchar key, size_t seed = 0)
Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.
[noexcept] size_t qHashBits(const void *p, size_t len, size_t seed = 0)
Devuelve el valor hash para el bloque de memoria de tamaño len apuntado por p, usando seed para sembrar el cálculo.
Utilice esta función sólo para implementar qHash() para sus propios tipos personalizados. Por ejemplo, así es como podrías implementar una sobrecarga de qHash() para 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); }
Esto aprovecha el hecho de que std::vector dispone sus datos de forma contigua. Si no es el caso, o el tipo contenido tiene relleno, debería utilizar qHashRange() en su lugar.
Vale la pena repetir que la implementación de qHashBits() - como las sobrecargas de qHash() ofrecidas por Qt - pueden cambiar en cualquier momento. No debe confiar en el hecho de que qHashBits() dará los mismos resultados (para las mismas entradas) en diferentes versiones de Qt.
Véase también qHashRange() y qHashRangeCommutative().
[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMulti(size_t seed, const T &... args)
Devuelve el valor hash de args, utilizando seed para sembrar el cálculo, aplicando sucesivamente qHash() a cada elemento y combinando los valores hash en uno solo.
Tenga en cuenta que el orden de los argumentos es importante. Si el orden no importa, utilice qHashMultiCommutative() en su lugar. Si está realizando un hash de memoria en bruto, utilice qHashBits(); si está realizando un hash de un rango, utilice qHashRange().
Esta función se proporciona como una conveniencia para implementar qHash() para sus propios tipos personalizados. Por ejemplo, así es como podrías implementar una sobrecarga de qHash() para una clase 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_H
Esta función se introdujo en Qt 6.0.
Nota: Esta función es noexcept cuando std::conjunction_v<QtPrivate::QNothrowHashable<T>...> es true.
Véase también qHashMultiCommutative y qHashRange.
[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMultiCommutative(size_t seed, const T &... args)
Devuelve el valor hash de args, utilizando seed para sembrar el cálculo, aplicando sucesivamente qHash() a cada elemento y combinando los valores hash en uno solo.
El orden de los argumentos es insignificante. Si el orden es importante, utilice qHashMulti() en su lugar, ya que puede producir un hash de mejor calidad. Si está realizando un hash de memoria en bruto, utilice qHashBits(); si está realizando un hash de un rango, utilice qHashRange().
Esta función se proporciona como una conveniencia para implementar qHash() para sus propios tipos personalizados.
Esta función se introdujo en Qt 6.0.
Nota: Esta función es noexcept cuando std::conjunction_v<QtPrivate::QNothrowHashable<T>...> es true.
Véase también qHashMulti y qHashRange.
[noexcept(...)] template <typename InputIterator> size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)
Devuelve el valor hash para el rango [first,last), utilizando seed para sembrar el cálculo, aplicando sucesivamente qHash() a cada elemento y combinando los valores hash en uno solo.
El valor de retorno de esta función depende del orden de los elementos en el rango. Esto significa que
{0, 1, 2}y
{1, 2, 0}hash a valores diferentes. Si el orden no importa, por ejemplo para tablas hash, utilice qHashRangeCommutative() en su lugar. Si estás haciendo hash en memoria bruta, utiliza qHashBits().
Utilice esta función sólo para implementar qHash() para sus propios tipos personalizados. Por ejemplo, así es como podrías implementar una sobrecarga de qHash() para std::vector<int>:
inline size_t qHash(const std::vector<int> &key, size_t seed = 0) { return qHashRange(key.begin(), key.end(), seed); }
Vale la pena repetir que la implementación de qHashRange() - como las sobrecargas de qHash() ofrecidas por Qt - puede cambiar en cualquier momento. No debe confiar en que qHashRange() dará los mismos resultados (para las mismas entradas) en diferentes versiones de Qt, incluso si qHash() para el tipo de elemento lo hiciera.
Nota: Esta función es noexcept cuando noexcept(qHash(*first, 0)) es true.
Véase también qHashBits() y qHashRangeCommutative().
[noexcept(...)] template <typename InputIterator> size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)
Devuelve el valor hash para el rango [first,last), utilizando seed para sembrar el cálculo, aplicando sucesivamente qHash() a cada elemento y combinando los valores hash en uno solo.
El valor de retorno de esta función no depende del orden de los elementos en el rango. Esto significa que
{0, 1, 2}y
{1, 2, 0}tienen los mismos valores hash. Si el orden importa, por ejemplo, para vectores y matrices, utilice qHashRange() en su lugar. Si está haciendo hash en memoria bruta, utilice qHashBits().
Utilice esta función sólo para implementar qHash() para sus propios tipos personalizados. Por ejemplo, así es como podrías implementar una sobrecarga de qHash() para 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); }
Vale la pena repetir que la implementación de qHashRangeCommutative() - como las sobrecargas de qHash() ofrecidas por Qt - puede cambiar en cualquier momento. No debe confiar en el hecho de que qHashRangeCommutative() dará los mismos resultados (para las mismas entradas) en diferentes versiones de Qt, incluso si qHash() para el tipo de elemento lo hiciera.
Nota: Esta función es noexcept cuando noexcept(qHash(*first, 0)) es true.
Véase también qHashBits() y qHashRange().
[noexcept] bool operator!=(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
Devuelve true si el hash lhs no es igual al hash rhs; en caso contrario devuelve false.
Dos hashes se consideran iguales si contienen los mismos pares (clave, valor).
Esta función requiere que el tipo de valor implemente operator==().
Véase también operator==().
template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QHash<Key, T> &hash)
Escribe el hash hash en el flujo out.
Esta función requiere que los tipos clave y valor se implementen operator<<().
Ver también Serializar tipos de datos Qt.
[noexcept] bool operator==(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
Devuelve true si el hash lhs es igual al hash rhs; en caso contrario devuelve false.
Dos hashes se consideran iguales si contienen los mismos pares (clave, valor).
Esta función requiere que el tipo de valor implemente operator==().
Véase también operator!=().
template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)
Lee un hash del flujo in en hash.
Esta función requiere que los tipos clave y valor implementen operator>>().
Véase también Serialización de tipos de datos Qt.
Documentación de macros
[since 6.11] QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD
Definir esta macro desactiva el soporte para las sobrecargas de qHash que sólo toman un argumento; en otras palabras, para las sobrecargas de qHash que no aceptan también una semilla. El soporte para las sobrecargas de un solo argumento de qHash está obsoleto y se eliminará en Qt 7.
Esta macro se introdujo en Qt 6.11.
Véase también 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.