QHash Class

template <typename Key, typename T> class QHash

Die Klasse QHash ist eine Vorlagenklasse, die ein auf Hash-Tabellen basierendes Wörterbuch bereitstellt. Mehr...

Kopfzeile: #include <QHash>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Typen

Öffentliche Funktionen

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)
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)
T value(const Key &key) const
T value(const Key &key, const T &defaultValue) const
QList<T> values() const
bool operator!=(const QHash<Key, T> &other) const
QHash<Key, T> &operator=(QHash<Key, T> &&other)
QHash<Key, T> &operator=(const QHash<Key, T> &other)
bool operator==(const QHash<Key, T> &other) const
T &operator[](const Key &key)
const T operator[](const Key &key) const
(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 QMqttTopicFilter &filter, size_t seed)
size_t qHash(QSslEllipticCurve key, size_t seed)
size_t qHash(QDate key, size_t seed = 0)
size_t qHash(const QStringRef &key, size_t seed)
size_t qHash(const QMqttTopicName &name, size_t seed)
size_t qHash(const QOcspResponse &key, size_t seed)
size_t qHash(const QGeoCoordinate &coordinate, size_t seed)
size_t qHash(ushort key, size_t seed = 0)
(since 6.0) size_t qHash(wchar_t key, size_t seed = 0)
size_t qHash(QLatin1StringView key, size_t seed = 0)
size_t qHash(const QSslCertificate &key, size_t seed)
(since 6.0) size_t qHash(QPoint key, size_t seed = 0)
size_t qHash(const QSslError &key, size_t seed)
size_t qHash(QTime key, size_t seed = 0)
size_t qHash(char key, size_t seed = 0)
(since 6.0) size_t qHash(char16_t key, size_t seed = 0)
(since 6.0) size_t qHash(char32_t key, size_t seed = 0)
(since 6.0) size_t qHash(char8_t key, size_t seed = 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)
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 key, size_t seed = 0)
size_t qHash(uchar key, size_t seed = 0)
size_t qHash(uint key, size_t seed = 0)
size_t qHash(ulong key, size_t seed = 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)
QDataStream &operator<<(QDataStream &out, const QHash<Key, T> &hash)
QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)

Detaillierte Beschreibung

QHash<Key, T> ist eine der generischen Container-Klassen von Qt. Sie speichert (Schlüssel, Wert) Paare und bietet eine sehr schnelle Suche nach dem Wert, der mit einem Schlüssel verbunden ist.

QHash bietet eine sehr ähnliche Funktionalität wie QMap. Die Unterschiede sind:

  • QHash bietet schnellere Nachschlagemöglichkeiten als QMap. (Siehe Algorithmische Komplexität für weitere Details).
  • Bei der Iteration über eine QMap werden die Elemente immer nach Schlüssel sortiert. Mit QHash sind die Elemente beliebig geordnet.
  • Der Schlüsseltyp eines QMap muss operator<() bereitstellen. Der Schlüsseltyp eines QHash muss operator==() und eine globale Hash-Funktion namens qHash() bereitstellen (siehe qHash).

Hier ist ein Beispiel QHash mit QString Schlüsseln und int Werten:

QHash<QString, int> hash;

Um ein (Schlüssel, Wert) Paar in den Hash einzufügen, können Sie operator[]() verwenden:

hash["one"] = 1;
hash["three"] = 3;
hash["seven"] = 7;

Dies fügt die folgenden drei (Schlüssel, Wert) Paare in den QHash ein: ("eins", 1), ("drei", 3) und ("sieben", 7). Eine weitere Möglichkeit, Elemente in den Hash einzufügen, ist die Verwendung von insert():

hash.insert("twelve", 12);

Um einen Wert nachzuschlagen, verwenden Sie operator[]() oder value():

int num1 = hash["thirteen"];
int num2 = hash.value("thirteen");

Wenn es im Hash kein Element mit dem angegebenen Schlüssel gibt, geben diese Funktionen einen standardmäßig konstruierten Wert zurück.

Wenn Sie prüfen wollen, ob der Hash einen bestimmten Schlüssel enthält, verwenden Sie contains():

int timeout = 30;
if (hash.contains("TIMEOUT"))
    timeout = hash.value("TIMEOUT");

Es gibt auch eine Überladung von value(), die ihr zweites Argument als Standardwert verwendet, wenn es kein Element mit dem angegebenen Schlüssel gibt:

int timeout = hash.value("TIMEOUT", 30);

Im Allgemeinen empfehlen wir, dass Sie contains() und value() statt operator[]() verwenden, um einen Schlüssel in einem Hash zu suchen. Der Grund dafür ist, dass operator[]() stillschweigend ein Element in den Hash einfügt, wenn kein Element mit demselben Schlüssel existiert (es sei denn, der Hash ist konstant). Der folgende Codeschnipsel erzeugt zum Beispiel 1000 Einträge im Speicher:

// WRONG
QHash<int, QWidget *> hash;
...
for (int i = 0; i < 1000; ++i) {
    if (hash[i] == okButton)
        cout << "Found button at index " << i << endl;
}

Um dieses Problem zu vermeiden, ersetzen Sie im obigen Code hash[i] durch hash.value(i).

Intern verwendet QHash eine Hash-Tabelle, um Suchvorgänge durchzuführen. Diese Hash-Tabelle wächst automatisch, um schnelle Suchvorgänge zu ermöglichen, ohne zu viel Speicher zu verschwenden. Sie können die Größe der Hash-Tabelle immer noch kontrollieren, indem Sie reserve() aufrufen, wenn Sie bereits ungefähr wissen, wie viele Elemente der QHash enthalten wird, aber dies ist nicht notwendig, um eine gute Leistung zu erzielen. Sie können auch capacity() aufrufen, um die Größe der Hash-Tabelle abzufragen.

QHash wird nicht automatisch verkleinert, wenn Elemente aus der Tabelle entfernt werden. Um den vom Hash verwendeten Speicher zu minimieren, rufen Sie squeeze() auf.

Wenn Sie durch alle in einem QHash gespeicherten (Schlüssel, Wert) Paare navigieren wollen, können Sie einen Iterator verwenden. QHash bietet sowohl Iteratoren im Java-Stil (QHashIterator und QMutableHashIterator) als auch Iteratoren im STL-Stil (QHash::const_iterator und QHash::iterator). Im Folgenden wird beschrieben, wie man mit einem Java-Iterator über einen QHash<QString, int> iteriert:

QHashIterator<QString, int> i(hash);
while (i.hasNext()) {
    i.next();
    cout << qPrintable(i.key()) << ": " << i.value() << endl;
}

Hier ist derselbe Code, aber mit einem Iterator im STL-Stil:

for (auto i = hash.cbegin(), end = hash.cend(); i != end; ++i)
    cout << qPrintable(i.key()) << ": " << i.value() << endl;

QHash ist ungeordnet, daher kann nicht davon ausgegangen werden, dass die Reihenfolge eines Iterators vorhersehbar ist. Wenn eine Ordnung nach Schlüssel erforderlich ist, verwenden Sie QMap.

Ein QHash erlaubt nur einen Wert pro Schlüssel. Wenn Sie insert() mit einem Schlüssel aufrufen, der bereits im QHash existiert, wird der vorherige Wert gelöscht. Zum Beispiel:

hash.insert("plenty", 100);
hash.insert("plenty", 2000);
// hash.value("plenty") == 2000

Wenn Sie mehrere Einträge für denselben Schlüssel in der Hashtabelle speichern müssen, verwenden Sie QMultiHash.

Wenn Sie nur die Werte aus einem Hash extrahieren müssen (nicht die Schlüssel), können Sie auch bereichsbasierte für verwenden:

QHash<QString, int> hash;
...
for (int value : std::as_const(hash))
    cout << value << endl;

Elemente können auf verschiedene Weise aus dem Hash entfernt werden. Eine Möglichkeit besteht darin, remove() aufzurufen; dadurch wird jedes Element mit dem angegebenen Schlüssel entfernt. Eine andere Möglichkeit ist die Verwendung von QMutableHashIterator::remove(). Darüber hinaus können Sie den gesamten Hash mit clear() löschen.

Die Schlüssel- und Wert-Datentypen von QHash müssen zuweisbare Datentypen sein. Sie können z.B. nicht QWidget als Wert speichern; speichern Sie stattdessen einen QWidget *.

Die Hash-Funktion

Der Schlüsseltyp eines QHash muss nicht nur ein zuweisbarer Datentyp sein, sondern auch noch weitere Anforderungen erfüllen: Er muss operator==() bereitstellen, und es muss auch eine Hash-Funktion vorhanden sein, die einen Hash-Wert für ein Argument vom Typ des Schlüssels zurückgibt.

Die Hashing-Funktion berechnet einen numerischen Wert auf der Grundlage eines Schlüssels. Sie kann jeden erdenklichen Algorithmus verwenden, solange sie immer den gleichen Wert zurückgibt, wenn sie das gleiche Argument erhält. Mit anderen Worten: Wenn e1 == e2, dann muss auch hash(e1) == hash(e2) gelten. Um eine gute Leistung zu erzielen, sollte die Hash-Funktion jedoch versuchen, so weit wie möglich unterschiedliche Hash-Werte für unterschiedliche Schlüssel zu liefern.

Eine Hashing-Funktion für einen Schlüsseltyp K kann auf zwei verschiedene Arten bereitgestellt werden.

Die erste Möglichkeit besteht darin, eine Überladung von qHash() im Namensraum von K bereitzustellen. Die Funktion qHash() muss eine der folgenden Signaturen haben:

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 use

Die Überladungen mit zwei Argumenten nehmen eine ganze Zahl ohne Vorzeichen entgegen, die als Seed für die Berechnung der Hash-Funktion verwendet werden soll. Dieser Seed wird von QHash zur Verfügung gestellt, um eine Familie von algorithmic complexity attacks zu verhindern.

Hinweis: In Qt 6 ist es möglich, eine qHash() Überladung mit nur einem Argument zu definieren; die Unterstützung dafür ist veraltet. Ab Qt 7 wird es obligatorisch sein, eine Überladung mit zwei Argumenten zu verwenden. Wenn sowohl eine Ein-Argument- als auch eine Zwei-Argumenten-Überladung für einen Schlüsseltyp definiert sind, wird letztere von QHash verwendet (beachten Sie, dass Sie einfach eine Zwei-Argumenten-Version definieren und einen Standardwert für den Seed-Parameter verwenden können).

Die zweite Möglichkeit, eine Hash-Funktion bereitzustellen, besteht darin, die Klasse std::hash für den Schlüsseltyp K zu spezialisieren und einen geeigneten Funktionsaufruf-Operator für sie bereitzustellen:

namespace std {
template <> struct hash<K>
{
    // seed is optional
    size_t operator()(const K &key, size_t seed = 0) const;
};
}

Das Argument seed hat die gleiche Bedeutung wie bei qHash() und kann weggelassen werden.

Dieser zweite Weg erlaubt die Wiederverwendung derselben Hash-Funktion zwischen QHash und den ungeordneten assoziativen Containern der C++ Standardbibliothek. Wenn sowohl eine qHash() Überladung als auch eine std::hash Spezialisierung für einen Typ zur Verfügung stehen, dann wird die qHash() Überladung bevorzugt.

Hier ist eine unvollständige Liste der C++- und Qt-Typen, die als Schlüssel in einem QHash dienen können: jeder Integer-Typ (char, unsigned long, etc.), jeder Zeigertyp, QChar, QString und QByteArray. Für alle diese Typen definiert der <QHash> Header eine qHash() Funktion, die einen adäquaten Hash-Wert berechnet. Viele andere Qt-Klassen deklarieren ebenfalls eine qHash Überladung für ihren Typ; bitte lesen Sie die Dokumentation der jeweiligen Klasse.

Wenn Sie andere Typen als Schlüssel verwenden wollen, stellen Sie sicher, dass Sie operator==() und eine Hash-Implementierung bereitstellen.

Die Komfortfunktion qHashMulti() kann verwendet werden, um qHash() für einen benutzerdefinierten Typ zu implementieren, bei dem man normalerweise einen Hash-Wert aus mehreren Feldern erzeugen möchte:

Beispiel:

#ifndef EMPLOYEE_H
#define EMPLOYEE_H

class Employee
{
public:
    Employee() {}
    Employee(const QString &name, QDate dateOfBirth);
    ...

private:
    QString myName;
    QDate myDateOfBirth;
};

inline bool operator==(const Employee &e1, const Employee &e2)
{
    return e1.name() == e2.name()
           && e1.dateOfBirth() == e2.dateOfBirth();
}

inline size_t qHash(const Employee &key, size_t seed)
{
    return qHashMulti(seed, key.name(), key.dateOfBirth());
}

#endif // EMPLOYEE_H

Im obigen Beispiel haben wir uns auf die Qt-eigene Implementierung von qHash() für QString und QDate verlassen, um einen Hash-Wert für den Namen bzw. das Geburtsdatum des Mitarbeiters zu erhalten.

Beachten Sie, dass sich die Implementierung der von Qt angebotenen qHash()-Überladungen jederzeit ändern kann. Sie dürfen sich nicht darauf verlassen, dass qHash() in verschiedenen Qt-Versionen dieselben Ergebnisse (für dieselben Eingaben) liefert.

Algorithmische Komplexitätsangriffe

Alle Hash-Tabellen sind anfällig für eine bestimmte Klasse von Denial-of-Service-Angriffen, bei denen der Angreifer sorgfältig eine Reihe von verschiedenen Schlüsseln vorberechnet, die im selben Bucket einer Hash-Tabelle gehasht werden sollen (oder sogar denselben Hash-Wert haben). Der Angriff zielt darauf ab, das schlimmstmögliche algorithmische Verhalten (O(n) anstelle von amortisiertem O(1), siehe Algorithmische Komplexität für Details) zu erhalten, wenn die Daten in die Tabelle eingegeben werden.

Um dieses Worst-Case-Verhalten zu vermeiden, kann die von qHash() durchgeführte Berechnung des Hashwerts mit einem zufälligen Seed gesalzen werden, der das Ausmaß des Angriffs aufhebt. Dieser Seed wird automatisch von QHash einmal pro Prozess generiert und dann von QHash als zweites Argument der Zwei-Argumente-Überladung der Funktion qHash() übergeben.

Diese Randomisierung von QHash ist standardmäßig aktiviert. Obwohl Programme niemals von einer bestimmten QHash-Reihenfolge abhängen sollten, kann es Situationen geben, in denen Sie vorübergehend ein deterministisches Verhalten benötigen, zum Beispiel zum Debuggen oder für Regressionstests. Um die Randomisierung zu deaktivieren, setzen Sie die Umgebungsvariable QT_HASH_SEED auf den Wert 0. Alternativ können Sie auch die Funktion QHashSeed::setDeterministicGlobalSeed() aufrufen.

Siehe auch QHashIterator, QMutableHashIterator, QMap, und QSet.

Dokumentation der Mitgliedstypen

QHash::ConstIterator

Qt-style ist ein Synonym für QHash::const_iterator.

QHash::Iterator

Qt-style ist ein Synonym für QHash::iterator.

QHash::const_key_value_iterator

Das QHash::const_key_value_iterator-Typedef bietet einen STL-artigen const-Iterator für QHash.

QHash::const_key_value_iterator ist im Wesentlichen dasselbe wie QHash::const_iterator mit dem Unterschied, dass operator*() ein Schlüssel/Wert-Paar statt eines Wertes zurückgibt.

Siehe auch QKeyValueIterator.

[alias] QHash::difference_type

Typendefinition für ptrdiff_t. Aus Gründen der STL-Kompatibilität bereitgestellt.

[alias] QHash::key_type

Typedef für Key. Aus Gründen der STL-Kompatibilität bereitgestellt.

QHash::key_value_iterator

Das QHash::key_value_iterator-Typedef bietet einen STL-artigen Iterator für QHash.

QHash::key_value_iterator ist im Wesentlichen dasselbe wie QHash::iterator mit dem Unterschied, dass operator*() ein Schlüssel/Wert-Paar statt eines Wertes zurückgibt.

Siehe auch QKeyValueIterator.

[alias] QHash::mapped_type

Typedef für T. Aus Gründen der STL-Kompatibilität bereitgestellt.

[alias] QHash::size_type

Typendefinition für int. Aus Gründen der STL-Kompatibilität zur Verfügung gestellt.

Dokumentation der Mitgliedsfunktionen

[noexcept] T QHash::value(const Key &key) const

[noexcept] T QHash::value(const Key &key, const T &defaultValue) const

Dies ist eine überladene Funktion.

Gibt den mit key verbundenen Wert zurück.

Wenn der Hash kein Element mit dem key enthält, gibt die Funktion defaultValue zurück, oder einen standardmäßig konstruierten Wert, wenn dieser Parameter nicht übergeben wurde.

[noexcept] Key QHash::key(const T &value) const

[noexcept] Key QHash::key(const T &value, const Key &defaultKey) const

Gibt den ersten Schlüssel zurück, der value zugeordnet ist. Enthält der Hash kein Element, das value zugeordnet ist, wird defaultKey zurückgegeben, oder ein standardmäßig konstruierter Schlüssel, wenn dieser Parameter nicht übergeben wurde.

Diese Funktion kann langsam sein(lineare Zeit), da die interne Datenstruktur von QHash für die schnelle Suche nach dem Schlüssel und nicht nach dem Wert optimiert ist.

[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 &&

Gibt ein Bereichsobjekt zurück, das die Iteration über diesen Hash als Schlüssel/Wert-Paare ermöglicht. Dieses Bereichsobjekt kann zum Beispiel in einer bereichsbasierten for-Schleife in Kombination mit einer strukturierten Bindungsdeklaration verwendet werden:

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
}

Beachten Sie, dass sowohl der Schlüssel als auch der Wert, die auf diese Weise erhalten werden, Verweise auf die im Hash enthaltenen Werte sind. Insbesondere wird durch die Änderung des Wertes der Hash selbst geändert.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Diese Funktion wurde in Qt 6.4 eingeführt.

Siehe auch QKeyValueIterator.

template <typename... Args> QHash<Key, T>::iterator QHash::emplace(Key &&key, Args &&... args)

template <typename... Args> QHash<Key, T>::iterator QHash::emplace(const Key &key, Args &&... args)

Fügt ein neues Element in den Container ein. Dieses neue Element wird an Ort und Stelle konstruiert, wobei args als Argumente für seine Konstruktion verwendet werden.

Gibt einen Iterator zurück, der auf das neue Element zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

[noexcept] QHash::QHash()

Konstruiert einen leeren Hash.

Siehe auch clear().

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

Konstruiert einen Hash mit einer Kopie jedes der Elemente in der Initialisierungsliste list.

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

Konstruiert einen Hash mit einer Kopie von jedem der Elemente im Iteratorbereich [begin, end). Entweder müssen die Elemente, die durch den Bereich iteriert werden, Objekte mit den Datenelementen first und second (wie std::pair) sein, die in Key bzw. T konvertierbar sind; oder die Iteratoren müssen über die Mitgliederfunktionen key() und value() verfügen, die einen in Key konvertierbaren Schlüssel bzw. einen in T konvertierbaren Wert zurückgeben.

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

Konstruiert eine Kopie von other.

Dieser Vorgang erfolgt in konstanter Zeit, da QHash implizit gemeinsam genutzt wird. Dies macht die Rückgabe eines QHash aus einer Funktion sehr schnell. Wenn eine gemeinsam genutzte Instanz geändert wird, wird sie kopiert (copy-on-write), was lineare Zeit benötigt.

Siehe auch operator=().

[noexcept] QHash::QHash(QHash<Key, T> &&other)

Move-konstruiert eine QHash-Instanz, die auf das gleiche Objekt zeigt, auf das other gezeigt hat.

QHash::~QHash()

Zerstört den Hash. Verweise auf die Werte im Hash und alle Iteratoren dieses Hashs werden ungültig.

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

Gibt einen Iterator im STL-Stil zurück, der auf das erste Element des Hashes zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch constBegin() und end().

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

Dies ist eine überladene Funktion.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

[noexcept] qsizetype QHash::capacity() const

Gibt die Anzahl der Buckets in der internen Hash-Tabelle von QHash zurück.

Der einzige Zweck dieser Funktion ist die Feinabstimmung der Speichernutzung von QHash. Im Allgemeinen werden Sie diese Funktion nur selten aufrufen müssen. Wenn Sie wissen wollen, wie viele Elemente sich in der Hashtabelle befinden, rufen Sie size() auf.

Siehe auch reserve() und squeeze().

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

Gibt einen Iterator im Stil von const STL zurück, der auf das erste Element des Hashes zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen oder wenn der Hash zerstört wird.

Siehe auch begin() und cend().

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

Gibt einen const STL-artigen Iterator zurück, der auf das imaginäre Element nach dem letzten Element im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch cbegin() und end().

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

Entfernt alle Elemente aus dem Hash und gibt den gesamten von ihm verwendeten Speicher frei.

Hinweis: Diese Funktion ist noexcept, wenn std::is_nothrow_destructible<Node>::value true ist.

Siehe auch remove().

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

Gibt einen Iterator im Stil von const STL zurück, der auf das erste Element des Hashes zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen oder wenn der Hash zerstört wird.

Siehe auch begin() und constEnd().

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

Gibt einen const STL-artigen Iterator zurück, der auf das imaginäre Element nach dem letzten Element im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch constBegin() und end().

[noexcept] QHash<Key, T>::const_iterator QHash::constFind(const Key &key) const

Gibt einen Iterator zurück, der auf das Element mit der Bezeichnung key im Hash zeigt.

Wenn der Hash kein Element mit key enthält, gibt die Funktion constEnd() zurück.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch find().

[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueBegin() const

Gibt einen const STL-artigen Iterator zurück, der auf den ersten Eintrag im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen oder wenn der Hash zerstört wird.

Siehe auch keyValueBegin().

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

Gibt einen const STL-artigen Iterator zurück, der auf den imaginären Eintrag nach dem letzten Eintrag im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch constKeyValueBegin().

[noexcept] bool QHash::contains(const Key &key) const

Gibt true zurück, wenn der Hash ein Element mit dem key enthält; andernfalls wird false zurückgegeben.

Siehe auch count().

[noexcept] qsizetype QHash::count(const Key &key) const

Gibt die Anzahl der mit key verbundenen Elemente zurück.

Siehe auch contains().

[noexcept] qsizetype QHash::count() const

Dies ist eine überladene Funktion.

Dasselbe wie size().

[noexcept] bool QHash::empty() const

Diese Funktion ist aus Gründen der STL-Kompatibilität vorgesehen. Sie ist äquivalent zu isEmpty() und gibt true zurück, wenn der Hash leer ist; andernfalls gibt sie false zurück.

[noexcept] QHash<Key, T>::iterator QHash::end()

Gibt einen Iterator im STL-Stil zurück, der auf das imaginäre Element nach dem letzten Element im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch begin() und constEnd().

[noexcept] QHash<Key, T>::const_iterator QHash::end() const

Dies ist eine überladene Funktion.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

QHash<Key, T>::iterator QHash::erase(QHash<Key, T>::const_iterator pos)

Entfernt das mit dem Iterator pos verbundene Paar (Schlüssel, Wert) aus dem Hash und gibt einen Iterator zum nächsten Element im Hash zurück.

Diese Funktion führt nicht dazu, dass QHash seine interne Datenstruktur neu aufbereitet. Das bedeutet, dass sie sicher aufgerufen werden kann, während sie durchläuft, und dass sie die Reihenfolge der Elemente im Hash nicht beeinflusst. Ein Beispiel:

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;
    }
}

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch remove(), take(), und find().

QHash<Key, T>::iterator QHash::find(const Key &key)

Gibt einen Iterator zurück, der auf das Element mit der Bezeichnung key im Hash zeigt.

Wenn der Hash kein Element mit key enthält, gibt die Funktion end() zurück.

Enthält der Hash mehrere Elemente mit der key, gibt diese Funktion einen Iterator zurück, der auf den zuletzt eingefügten Wert verweist. Auf die anderen Werte kann durch Inkrementieren des Iterators zugegriffen werden. Hier ist zum Beispiel ein Code, der alle Elemente mit demselben Schlüssel durchläuft:

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;
}

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch value() und values().

[noexcept] QHash<Key, T>::const_iterator QHash::find(const Key &key) const

Dies ist eine überladene Funktion.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

void QHash::insert(const QHash<Key, T> &other)

Fügt alle Elemente des Hashes other in diesen Hash ein.

Wenn ein Schlüssel in beiden Hashes vorkommt, wird sein Wert durch den in other gespeicherten Wert ersetzt.

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

Fügt ein neues Element mit der Bezeichnung key und einem Wert von value ein.

Wenn es bereits ein Element mit dem Wert key gibt, wird der Wert dieses Elements durch value ersetzt.

Gibt einen Iterator zurück, der auf das neue/aktualisierte Element zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen oder wenn der Hash zerstört wird.

[noexcept] bool QHash::isEmpty() const

Gibt true zurück, wenn der Hash keine Elemente enthält; andernfalls wird false zurückgegeben.

Siehe auch size().

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

Gibt einen const STL-artigen Iterator zurück, der auf den ersten Schlüssel im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch keyEnd().

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

Gibt einen const STL-artigen Iterator zurück, der auf das imaginäre Element nach dem letzten Schlüssel im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch keyBegin().

QHash<Key, T>::key_value_iterator QHash::keyValueBegin()

Gibt einen Iterator im STL-Stil zurück, der auf den ersten Eintrag im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch keyValueEnd().

[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueBegin() const

Gibt einen const STL-artigen Iterator zurück, der auf den ersten Eintrag im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen oder wenn der Hash zerstört wird.

Siehe auch keyValueEnd().

QHash<Key, T>::key_value_iterator QHash::keyValueEnd()

Gibt einen Iterator im STL-Stil zurück, der auf den imaginären Eintrag nach dem letzten Eintrag im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch keyValueBegin().

[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueEnd() const

Gibt einen const STL-artigen Iterator zurück, der auf den imaginären Eintrag nach dem letzten Eintrag im Hash zeigt.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch keyValueBegin().

QList<Key> QHash::keys() const

Gibt eine Liste mit allen Schlüsseln des Hashes in beliebiger Reihenfolge zurück.

Die Reihenfolge ist garantiert dieselbe wie die von values() verwendete.

Diese Funktion erstellt eine neue Liste in linearer Zeit. Der damit verbundene Zeit- und Speicherbedarf kann durch Iteration von keyBegin() zu keyEnd() vermieden werden.

Siehe auch values() und key().

QList<Key> QHash::keys(const T &value) const

Dies ist eine überladene Funktion.

Gibt eine Liste mit allen Schlüsseln zurück, die dem Wert value zugeordnet sind, und zwar in beliebiger Reihenfolge.

Diese Funktion kann langsam sein(lineare Zeit), da die interne Datenstruktur von QHash für schnelles Nachschlagen nach Schlüssel und nicht nach Wert optimiert ist.

[noexcept] float QHash::load_factor() const

Gibt den aktuellen Auslastungsgrad der internen Hash-Tabelle von QHash zurück. Dies ist dasselbe wie capacity()/size(). Die verwendete Implementierung wird versuchen, den Auslastungsfaktor zwischen 0,25 und 0,5 zu halten. Dadurch wird vermieden, dass zu viele Kollisionen in der Hashtabelle auftreten, die die Leistung beeinträchtigen würden.

Selbst bei einem niedrigen Lastfaktor hat die Implementierung der Hashtabelle einen sehr geringen Speicher-Overhead.

Diese Methode dient nur zu Diagnosezwecken und Sie sollten sie nur selten selbst aufrufen müssen.

Siehe auch reserve() und squeeze().

bool QHash::remove(const Key &key)

Entfernt das Element mit der Adresse key aus dem Hash. Gibt true zurück, wenn der Schlüssel im Hash existiert und das Element entfernt wurde, andernfalls false.

Siehe auch clear() und take().

[since 6.1] template <typename Predicate> qsizetype QHash::removeIf(Predicate pred)

Entfernt alle Elemente, für die das Prädikat pred den Wert true liefert, aus dem Hash.

Die Funktion unterstützt Prädikate, die entweder ein Argument vom Typ QHash<Key, T>::iterator oder ein Argument vom Typ std::pair<const Key &, T &> annehmen.

Gibt die Anzahl der entfernten Elemente zurück, falls vorhanden.

Diese Funktion wurde in Qt 6.1 eingeführt.

Siehe auch clear() und take().

void QHash::reserve(qsizetype size)

Stellt sicher, dass die interne Hash-Tabelle von QHash Platz hat, um mindestens size Elemente zu speichern, ohne die Hash-Tabelle vergrößern zu müssen.

Dies impliziert, dass die Hash-Tabelle mindestens 2 * size Buckets enthält, um eine gute Leistung zu gewährleisten.

Diese Funktion ist nützlich für Code, der einen großen Hash aufbauen muss und wiederholte Neuzuweisungen vermeiden will. Ein Beispiel:

QHash<QString, int> hash;
hash.reserve(20000);
for (int i = 0; i < 20000; ++i)
    hash.insert(keys[i], values[i]);

Idealerweise sollte size die maximale Anzahl von Elementen sein, die im Hash erwartet werden. QHash wählt dann die kleinstmögliche Anzahl von Buckets, die es erlaubt, size Elemente in der Tabelle zu speichern, ohne die interne Hash-Tabelle vergrößern zu müssen. Wenn size zu niedrig angesetzt ist, wird QHash im schlimmsten Fall etwas langsamer sein.

Im Allgemeinen werden Sie diese Funktion nur selten aufrufen müssen. QHash Die interne Hash-Tabelle von wächst automatisch, um eine gute Leistung zu erzielen, ohne zu viel Speicher zu verschwenden.

Siehe auch squeeze() und capacity().

[noexcept] qsizetype QHash::size() const

Gibt die Anzahl der Elemente im Hash zurück.

Siehe auch isEmpty() und count().

void QHash::squeeze()

Verringert die Größe der internen Hashtabelle von QHash, um Speicher zu sparen.

Der einzige Zweck dieser Funktion ist die Feinabstimmung der Speichernutzung von QHash. Im Allgemeinen werden Sie diese Funktion nur selten aufrufen müssen.

Siehe auch reserve() und capacity().

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

Tauscht diesen Hash mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.

T QHash::take(const Key &key)

Entfernt das Element mit der Adresse key aus dem Hash und gibt den damit verbundenen Wert zurück.

Wenn das Element nicht im Hash vorhanden ist, gibt die Funktion einfach einen standardmäßig konstruierten Wert zurück.

Wenn Sie den Rückgabewert nicht verwenden, ist remove() effizienter.

Siehe auch remove().

QList<T> QHash::values() const

Gibt eine Liste zurück, die alle Werte des Hashes in beliebiger Reihenfolge enthält.

Die Reihenfolge ist garantiert dieselbe wie die von keys() verwendete.

Diese Funktion erstellt eine neue Liste in linearer Zeit. Der damit verbundene Zeit- und Speicherbedarf kann durch Iteration von keyValueBegin() zu keyValueEnd() vermieden werden.

Siehe auch keys() und value().

bool QHash::operator!=(const QHash<Key, T> &other) const

Gibt true zurück, wenn other nicht mit diesem Hash übereinstimmt; andernfalls wird false zurückgegeben.

Zwei Hashes werden als gleich angesehen, wenn sie die gleichen (Schlüssel, Wert) Paare enthalten.

Diese Funktion erfordert, dass der Wertetyp operator==() implementiert.

Siehe auch operator==().

[noexcept] QHash<Key, T> &QHash::operator=(QHash<Key, T> &&other)

Verschieben - weist other dieser QHash Instanz zu.

[noexcept(...)] QHash<Key, T> &QHash::operator=(const QHash<Key, T> &other)

Weist other diesem Hash zu und gibt einen Verweis auf diesen Hash zurück.

Hinweis: Diese Funktion ist noexcept, wenn std::is_nothrow_destructible<Node>::value true ist.

bool QHash::operator==(const QHash<Key, T> &other) const

Gibt true zurück, wenn other mit diesem Hash gleich ist; andernfalls wird false zurückgegeben.

Zwei Hashes werden als gleich angesehen, wenn sie die gleichen (Schlüssel, Wert) Paare enthalten.

Diese Funktion setzt voraus, dass der Wertetyp operator==() implementiert ist.

Siehe auch operator!=().

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

Gibt den mit key verbundenen Wert als veränderbaren Verweis zurück.

Enthält der Hash kein Element mit der Bezeichnung key, fügt die Funktion einen standardmäßig konstruierten Wert in den Hash mit der Bezeichnung key ein und gibt einen Verweis darauf zurück.

Warnung: Zurückgegebene Iteratoren/Referenzen sollten als ungültig betrachtet werden, wenn Sie das nächste Mal eine nicht-konstante Funktion auf dem Hash aufrufen, oder wenn der Hash zerstört wird.

Siehe auch insert() und value().

[noexcept] const T QHash::operator[](const Key &key) const

Dies ist eine überladene Funktion.

Dasselbe wie value().

Verwandte Nicht-Mitglieder

[since 6.1] template <typename Key, typename T, typename Predicate> qsizetype erase_if(QHash<Key, T> &hash, Predicate pred)

Entfernt alle Elemente, für die das Prädikat pred den Wert true liefert, aus dem Hash hash.

Die Funktion unterstützt Prädikate, die entweder ein Argument vom Typ QHash<Key, T>::iterator oder ein Argument vom Typ std::pair<const Key &, T &> annehmen.

Gibt die Anzahl der entfernten Elemente zurück, falls vorhanden.

Diese Funktion wurde in Qt 6.1 eingeführt.

[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)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Hinweis: Vor Qt 6.5 waren unscoped enums aufgrund der impliziten Konvertierung in die zugrunde liegenden Integer-Typen auf die Integer-Überladungen dieser Funktion angewiesen. Für scoped enums musste man selbst eine Überladung implementieren. Dies ist immer noch die rückwärtskompatible Lösung, um mit älteren Qt-Versionen kompatibel zu bleiben.

Diese Funktion wurde in Qt 6.5 eingeführt.

[noexcept] size_t qHash(QDate key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(ushort key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept, since 6.0] size_t qHash(wchar_t key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[noexcept] size_t qHash(QLatin1StringView key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept, since 6.0] size_t qHash(QPoint key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[noexcept] size_t qHash(QTime key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(char key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept, since 6.0] size_t qHash(char16_t key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[constexpr noexcept, since 6.0] size_t qHash(char32_t key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[constexpr noexcept, since 6.0] size_t qHash(char8_t key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[noexcept] size_t qHash(const QBitArray &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept] size_t qHash(const QByteArray &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(const QChar key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

size_t qHash(const QDateTime &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

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

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

Die Typen Key und T müssen von qHash() unterstützt werden.

Hinweis: Diese Funktion ist noexcept, wenn noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())) true ist.

[noexcept(...)] template <typename T> size_t qHash(const QSet<T> &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

Der Typ T muss von qHash() unterstützt werden.

Der Hash-Wert ist unabhängig von der Reihenfolge der Elemente in key, d. h. Mengen, die dieselben Elemente enthalten, ergeben denselben Hash-Wert.

Hinweis: Diese Funktion ist noexcept, wenn noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)) true ist.

[noexcept] size_t qHash(const QString &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[since 6.0] size_t qHash(const QTypeRevision &key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[noexcept] size_t qHash(const QUrl &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

size_t qHash(const QVersionNumber &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept] template <typename T> size_t qHash(const T *key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept(...)] template <typename T1, typename T2> size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

Die Typen T1 und T2 müssen von qHash() unterstützt werden.

Hinweis: Diese Funktion ist noexcept, wenn QHashPrivate::noexceptPairHash<T1, T2>() true ist.

[noexcept] size_t qHash(double key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept] size_t qHash(float key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(int key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(long key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept] size_t qHash(long double key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept, since 6.8] size_t qHash(qint128 key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

Hinweis: Diese Funktion ist nur auf Plattformen verfügbar, die einen nativen 128-Bit-Integer-Typ unterstützen.

Diese Funktion wurde in Qt 6.8 eingeführt.

[constexpr noexcept] size_t qHash(qint64 key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept, since 6.8] size_t qHash(quint128 key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

Hinweis: Diese Funktion ist nur auf Plattformen verfügbar, die einen nativen 128-Bit-Integer-Typ unterstützen.

Diese Funktion wurde in Qt 6.8 eingeführt.

[constexpr noexcept] size_t qHash(quint64 key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(short key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(signed char key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept, since 6.0] size_t qHash(std::nullptr_t key, size_t seed = 0)

Gibt den Hashwert für key zurück, wobei seed als Seed für die Berechnung verwendet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[constexpr noexcept] size_t qHash(uchar key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(uint key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[constexpr noexcept] size_t qHash(ulong key, size_t seed = 0)

Gibt den Hash-Wert für key zurück, wobei seed als Startwert für die Berechnung verwendet wird.

[noexcept] size_t qHashBits(const void *p, size_t len, size_t seed = 0)

Gibt den Hash-Wert für den Speicherblock der Größe len zurück, auf den p verweist, wobei seed als Startwert für die Berechnung verwendet wird.

Verwenden Sie diese Funktion nur, um qHash() für Ihre eigenen benutzerdefinierten Typen zu implementieren. Zum Beispiel könnten Sie hier eine qHash()-Überladung für std::vector<int> implementieren:

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);
}

Dies macht sich die Tatsache zunutze, dass std::vector seine Daten zusammenhängend anordnet. Wenn das nicht der Fall ist oder der enthaltene Typ Füllung hat, sollten Sie stattdessen qHashRange() verwenden.

Es sei nochmals darauf hingewiesen, dass sich die Implementierung von qHashBits() - wie auch die von Qt angebotenen qHash()-Überladungen - jederzeit ändern kann. Sie dürfen sich nicht darauf verlassen, dass qHashBits() in verschiedenen Qt-Versionen dieselben Ergebnisse (für dieselben Eingaben) liefert.

Siehe auch qHashRange() und qHashRangeCommutative().

[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMulti(size_t seed, const T &... args)

Gibt den Hashwert für args zurück, wobei seed als Startwert für die Berechnung verwendet wird, indem qHash() nacheinander auf jedes Element angewendet und die Hashwerte zu einem einzigen kombiniert werden.

Beachten Sie, dass die Reihenfolge der Argumente von Bedeutung ist. Wenn die Reihenfolge keine Rolle spielt, verwenden Sie stattdessen qHashMultiCommutative(). Beim Hashing von Rohspeicher verwenden Sie qHashBits(); beim Hashing eines Bereichs verwenden Sie qHashRange().

Diese Funktion wird als Hilfestellung für die Implementierung von qHash() für Ihre eigenen benutzerdefinierten Typen bereitgestellt. So könnten Sie zum Beispiel eine qHash()-Überladung für eine Klasse Employee implementieren:

#ifndef EMPLOYEE_H
#define EMPLOYEE_H

class Employee
{
public:
    Employee() {}
    Employee(const QString &name, QDate dateOfBirth);
    ...

private:
    QString myName;
    QDate myDateOfBirth;
};

inline bool operator==(const Employee &e1, const Employee &e2)
{
    return e1.name() == e2.name()
           && e1.dateOfBirth() == e2.dateOfBirth();
}

inline size_t qHash(const Employee &key, size_t seed)
{
    return qHashMulti(seed, key.name(), key.dateOfBirth());
}

#endif // EMPLOYEE_H

Diese Funktion wurde in Qt 6.0 eingeführt.

Hinweis: Diese Funktion ist noexcept, wenn std::conjunction_v<QtPrivate::QNothrowHashable<T>...> true ist.

Siehe auch qHashMultiCommutative und qHashRange.

[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMultiCommutative(size_t seed, const T &... args)

Gibt den Hashwert für args zurück, wobei seed als Startwert für die Berechnung verwendet wird, indem qHash() nacheinander auf jedes Element angewendet und die Hashwerte zu einem einzigen kombiniert werden.

Die Reihenfolge der Argumente ist unbedeutend. Wenn die Reihenfolge eine Rolle spielt, verwenden Sie stattdessen qHashMulti(), da dies zu einer besseren Hash-Qualität führen kann. Beim Hashing von Rohspeicher verwenden Sie qHashBits(); beim Hashing eines Bereichs verwenden Sie qHashRange().

Diese Funktion wird als Hilfestellung für die Implementierung von qHash() für Ihre eigenen benutzerdefinierten Typen bereitgestellt.

Diese Funktion wurde in Qt 6.0 eingeführt.

Hinweis: Diese Funktion ist noexcept, wenn std::conjunction_v<QtPrivate::QNothrowHashable<T>...> true ist.

Siehe auch qHashMulti und qHashRange.

[noexcept(...)] template <typename InputIterator> size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)

Gibt den Hashwert für den Bereich [first,last) zurück, wobei seed als Startwert für die Berechnung verwendet wird, indem qHash() nacheinander auf jedes Element angewendet und die Hashwerte zu einem einzigen kombiniert werden.

Der Rückgabewert dieser Funktion hängt von der Reihenfolge der Elemente im Bereich ab. Das bedeutet, dass

{0, 1, 2}

und

{1, 2, 0}

zu unterschiedlichen Werten hashen. Wenn die Reihenfolge keine Rolle spielt, z. B. bei Hashtabellen, verwenden Sie stattdessen qHashRangeCommutative(). Wenn Sie einen Hash im Rohspeicher durchführen, verwenden Sie qHashBits().

Verwenden Sie diese Funktion nur, um qHash() für Ihre eigenen benutzerdefinierten Typen zu implementieren. So könnten Sie zum Beispiel eine qHash()-Überladung für std::vector<int> implementieren:

inline size_t qHash(const std::vector<int> &key, size_t seed = 0)
{
    return qHashRange(key.begin(), key.end(), seed);
}

Es sei noch einmal darauf hingewiesen, dass sich die Implementierung von qHashRange() - wie die von Qt angebotenen qHash()-Überladungen - jederzeit ändern kann. Sie dürfen sich nicht darauf verlassen, dass qHashRange() in verschiedenen Qt-Versionen die gleichen Ergebnisse (für die gleichen Eingaben) liefert, auch wenn qHash() für den Elementtyp dies tun würde.

Hinweis: Diese Funktion ist noexcept, wenn noexcept(qHash(*first)) true ist.

Siehe auch qHashBits() und qHashRangeCommutative().

[noexcept(...)] template <typename InputIterator> size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)

Gibt den Hashwert für den Bereich [first,last) zurück, wobei seed als Startwert für die Berechnung verwendet wird, indem qHash() nacheinander auf jedes Element angewendet und die Hashwerte zu einem einzigen kombiniert werden.

Der Rückgabewert dieser Funktion hängt nicht von der Reihenfolge der Elemente im Bereich ab. Das bedeutet, dass

{0, 1, 2}

und

{1, 2, 0}

zu den gleichen Werten hashen. Wenn die Reihenfolge eine Rolle spielt, z. B. bei Vektoren und Arrays, verwenden Sie stattdessen qHashRange(). Wenn Sie Rohspeicher hashen, verwenden Sie qHashBits().

Verwenden Sie diese Funktion nur, um qHash() für Ihre eigenen benutzerdefinierten Typen zu implementieren. So könnten Sie zum Beispiel eine qHash()-Überladung für std::unordered_set<int> implementieren:

inline size_t qHash(const std::unordered_set<int> &key, size_t seed = 0)
{
    return qHashRangeCommutative(key.begin(), key.end(), seed);
}

Es sei nochmals darauf hingewiesen, dass sich die Implementierung von qHashRangeCommutative() - wie die von Qt angebotenen qHash()-Überladungen - jederzeit ändern kann. Man darf sich nicht darauf verlassen, dass qHashRangeCommutative() in verschiedenen Qt-Versionen die gleichen Ergebnisse (für die gleichen Eingaben) liefert, auch wenn qHash() für den Elementtyp dies tun würde.

Hinweis: Diese Funktion ist noexcept, wenn noexcept(qHash(*first)) true ist.

Siehe auch qHashBits() und qHashRange().

template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QHash<Key, T> &hash)

Schreibt den Hash hash in den Stream out.

Diese Funktion erfordert die Implementierung der Schlüssel- und Werttypen operator<<().

Siehe auch Serialisierung von Qt-Datentypen.

template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)

Liest einen Hash aus dem Stream in in hash.

Für diese Funktion müssen die Schlüssel- und Werttypen operator>>() implementiert werden.

Siehe auch Serialisierung von Qt-Datentypen.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.