QMultiHash Class

The QMultiHash class is a convenience QHash subclass that provides multi-valued hashes. More...

Header: #include <QMultiHash>
qmake: QT += core
Inherits: QHash

Note: All functions in this class are reentrant.

int qGlobalQHashSeed()
uint qHash(const QUrl &url, uint seed = 0)
uint qHash(float key, uint seed = 0)
uint qHash(double key, uint seed = 0)
uint qHash(long double key, uint seed = 0)
void qSetGlobalQHashSeed(int newSeed)

Detailed Description

QMultiHash<Key, T> is one of Qt's generic container classes. It inherits QHash and extends it with a few convenience functions that make it more suitable than QHash for storing multi-valued hashes. A multi-valued hash is a hash that allows multiple values with the same key; QHash normally doesn't allow that, unless you call QHash::insertMulti().

Because QMultiHash inherits QHash, all of QHash's functionality also applies to QMultiHash. For example, you can use isEmpty() to test whether the hash is empty, and you can traverse a QMultiHash using QHash's iterator classes (for example, QHashIterator). But in addition, it provides an insert() function that corresponds to QHash::insertMulti(), and a replace() function that corresponds to QHash::insert(). It also provides convenient operator+() and operator+=().

Example:


  QMultiHash<QString, int> hash1, hash2, hash3;

  hash1.insert("plenty", 100);
  hash1.insert("plenty", 2000);
  // hash1.size() == 2

  hash2.insert("plenty", 5000);
  // hash2.size() == 1

  hash3 = hash1 + hash2;
  // hash3.size() == 3

Unlike QHash, QMultiHash provides no operator[]. Use value() or replace() if you want to access the most recently inserted item with a certain key.

If you want to retrieve all the values for a single key, you can use values(const Key &key), which returns a QList<T>:


  QList<int> values = hash.values("plenty");
  for (int i = 0; i < values.size(); ++i)
      cout << values.at(i) << endl;

The items that share the same key are available from most recently to least recently inserted.

A more efficient approach is to call find() to get the STL-style iterator for the first item with a key and iterate from there:


  QMultiHash<QString, int>::iterator i = hash.find("plenty");
  while (i != hash.end() && i.key() == "plenty") {
      cout << i.value() << endl;
      ++i;
  }

QMultiHash's key and value data types must be assignable data types. You cannot, for example, store a QWidget as a value; instead, store a QWidget *. In addition, QMultiHash's key type must provide operator==(), and there must also be a qHash() function in the type's namespace that returns a hash value for an argument of the key's type. See the QHash documentation for details.

See also QHash, QHashIterator, QMutableHashIterator, and QMultiMap.