QMap与QHash
?關聯容器可以保存任意多個具有相同類型的項,且它們由一個鍵索引。Qt提供兩個主要的關聯容器類:QMap<K, T>和QHash<K, T>。
?????QMap<K, T>是一個以升序鍵順序存儲鍵值對的數據結構。這種排列使它可以提供良好的查找插入性能及鍵序的迭代。在內部,QMap<K, T>是作為一個跳越列表(skip-list)來實現執行的。
???? 在映射中插入項的一種簡單方式是調用insert():
QMap<QString, int> map;
map.insert("eins", 1);
map.insert("sieben", 7);
map.insert("dreiundzwanzig", 23);
另外,也可以像下面一樣,給一個指定的鍵賦值:
map["eins"] = 1;
map["sieben"] = 7;
map["dreiundzwanzig"] = 23;
????[]操作符即可以用于插入也可以用于檢索。如果在非常量映射中使用[]為一個不存在的鍵檢索值,則會用給定的鍵和空值創建一個新的項。為了避免意外的創建空值,可以使用value()函數代替[]操作符來獲得項。
int val = map.value("dreiundzwanzig")
????如果鍵不存在,則利用值類型的默認構造函數,將返回一個默認值,同時不會創建新的項。對于基本類型和指針類型,將返回0值。我們可以指定另一默認值作為value()的第二個參數,例如:
int seconds = map.value("delay", 30);
這相當于:
int seconds = 30;
if (map.contains("delay");
??? seconds = map.value("delay");
????QMap<K, T>的K和T數據類型可以是與int、double、指針類型、有默認構造函數的類、復制構造函數和賦值操作符相似的基本數據類型。此外,K類型必須提供operator<(),因為QMap<K, T>要使用這個操作符以提升鍵序順序存儲項。
??? QMap<K, T>的K和T有一對方便的函數keys()和values(),它們在處理小數據集時顯的特別有用。它們分別返回映射鍵的QList和映射值的QList。
映射通常都是單一值的:如果賦予一個現有的鍵一個新值,則原有的舊值將被該新值取代,以確保兩個項不會共有同一個鍵。通過使用insertMulti()函數或者QMlltiMap<K, T>方便的子類,可以讓多個鍵值對有相同的鍵。QMap<K, T>重載了value(const K &), 返回一個給定鍵多有值的QList列表。例如:
QMultiMap<int, QString> multiMap;
multiMap.insert(1, "one");
multiMap.insert(1, "eins");
multiMap.insert(1, "uno");
QList<QString> vals = multiMap.values(1);
??? QHash<K, T>是一個在哈希表中存儲鍵值對的數據結構。它的接口幾乎與QMap<K, T>相同,但是與QMap<K, T>相比,它對K的模板類型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。
????除了對存儲在容器類中的所有值類型的一般要求,QHash<K, T>中K的值類型還需要提供一個operator==(),并需要一個能夠為鍵返回哈希值的全局qHash()函數的支持。Qt已經為qHash()函數提供了對整型、指針型、QChar、QString以及QByteArray。
??? QHash<K, T>為它內部的哈希表自動分配最初的存儲區域,并在有項被插入或者刪除時重新劃分所分配的存儲區域的大小。也可以通過調用reserve()或者squeeze()來指定或者壓縮希望存儲到哈希表中的項的數目,以進行性能調整。通常的做法是利用我們預期的最大的項的數目來條用reserve(),然后插入數據,最后如果有多出的項,則調用squeeze()以使內存的使用減到最小。
????雖然哈希表通常都是單一值的,但是使用insertMulti()函數或者MultiHash<K, T>方便的子類,也可以將多個值賦給同一個鍵。
????除了QHash<K, T>之外,Qt還提供了一個用來高速緩存與鍵相關聯的對象的QCache<K, T>類以及僅僅存儲鍵的QSet<K>容器。在內部,它們都依賴于QHash<K, T>,且都像QHash<K, T>一樣對K的類型有相同的要求。
????最簡便的遍歷存儲在關聯容器中多有鍵值對的方式是使用Java風格的迭代器。因為迭代器必須能同時訪問鍵和值,針對關聯容器的Java風格的迭代器與連續容器的在運作方式有些差異。只要區別在于next()和previous()函數返回一個代表鍵值對的對象,而不是一個簡單的值。我們可以使用key()和value()分別從這個對象中獲得鍵和值。例如:
QMap<QString, int> map;
...
int sum = 0;
QMapIterator<QString, int> i(map);
while (i.hasNext())
??? sum += i.next().value();
??? 如果需要同時存取鍵和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函數,它們都是針對最后被跳過的項進行操作的:
QMapIterator<QString, int> i(map);
while(i.hasNext()){
??? i.next();
??? if (i.value() > largestValue){
??????? largestKey = i.key();
??????? largestValue = i.value();
??? }
}???
?
===========================================================================================
原文鏈接:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html
QMap提供了一個從類項為key的鍵到類項為T的直的映射,通常所存儲的數據類型是一個鍵對應一個直,并且按照Key的次序存儲數據,
這個類也支持一鍵多值的情況,用類QMultiMap
QHash具有和QMap幾乎完全一樣的APi,此類維護這一張哈希表,表的大小和數據項是自適應的,QHash是以任意的順序住址他的數據,,當然了他也是可以支持一鍵多值的,QMultiHash
兩種之間的區別是:
QHash查找速度上顯著于QMap
QHash以任意的方式進行存儲,而QMap則是以key順序進行存儲
Qhash 的鍵類型必須提供operator==()和一個全局的qHash(key)函數。而QMap的鍵類型key必須提供operator<()函數
他們同樣也是有兩種風格的迭代容器。用來進行遍歷的。。
STL 風格的
下面以一個例子來進行說明:
#include <QDebug>int?main(int?argc,?char?*argv[])
{
? ??QMap<QString, QString>?map;
? ? map.insert("beijing",?"111");
? ? map.insert("shanghai",?"021");
? ? map.insert("tianjin",?"022");
? ? map.insert("chongqing",?"023");
? ? map.insert("jinan",?"0531");
? ? map.insert("wuhan",?"027");???
QMap<QString, QString>::const_iterator?i;
? ??for(?i=map.constBegin();?i!=map.constEnd();?++i)
? ? ? ? qDebug()?<<?i.key()?<<" ? ? ? ?"?<<?i.value();???
? ? ? ?
? ? QMap<QString, QString>::iterator?mi;
? ? mi?=?map.find("beijing");
? ??if(mi?!=?map.end())
? ? ? ? mi.value()?=?"010";
? ? QMap<QString, QString>::const_iterator?modi;
? ? qDebug()?<<?"";
? ??for(?modi=map.constBegin();?modi!=map.constEnd();?++modi)
? ? ? ? qDebug()?<<?modi.key()?<<" ? ? ? ?"?<<?modi.value();???
? ??return?0;
}
?關聯容器可以保存任意多個具有相同類型的項,且它們由一個鍵索引。Qt提供兩個主要的關聯容器類:QMap<K, T>和QHash<K, T>。
?????QMap<K, T>是一個以升序鍵順序存儲鍵值對的數據結構。這種排列使它可以提供良好的查找插入性能及鍵序的迭代。在內部,QMap<K, T>是作為一個跳越列表(skip-list)來實現執行的。
???? 在映射中插入項的一種簡單方式是調用insert():
QMap<QString, int> map;
map.insert("eins", 1);
map.insert("sieben", 7);
map.insert("dreiundzwanzig", 23);
另外,也可以像下面一樣,給一個指定的鍵賦值:
map["eins"] = 1;
map["sieben"] = 7;
map["dreiundzwanzig"] = 23;
????[]操作符即可以用于插入也可以用于檢索。如果在非常量映射中使用[]為一個不存在的鍵檢索值,則會用給定的鍵和空值創建一個新的項。為了避免意外的創建空值,可以使用value()函數代替[]操作符來獲得項。
int val = map.value("dreiundzwanzig")
????如果鍵不存在,則利用值類型的默認構造函數,將返回一個默認值,同時不會創建新的項。對于基本類型和指針類型,將返回0值。我們可以指定另一默認值作為value()的第二個參數,例如:
int seconds = map.value("delay", 30);
這相當于:
int seconds = 30;
if (map.contains("delay");
??? seconds = map.value("delay");
????QMap<K, T>的K和T數據類型可以是與int、double、指針類型、有默認構造函數的類、復制構造函數和賦值操作符相似的基本數據類型。此外,K類型必須提供operator<(),因為QMap<K, T>要使用這個操作符以提升鍵序順序存儲項。
??? QMap<K, T>的K和T有一對方便的函數keys()和values(),它們在處理小數據集時顯的特別有用。它們分別返回映射鍵的QList和映射值的QList。
映射通常都是單一值的:如果賦予一個現有的鍵一個新值,則原有的舊值將被該新值取代,以確保兩個項不會共有同一個鍵。通過使用insertMulti()函數或者QMlltiMap<K, T>方便的子類,可以讓多個鍵值對有相同的鍵。QMap<K, T>重載了value(const K &), 返回一個給定鍵多有值的QList列表。例如:
QMultiMap<int, QString> multiMap;
multiMap.insert(1, "one");
multiMap.insert(1, "eins");
multiMap.insert(1, "uno");
QList<QString> vals = multiMap.values(1);
??? QHash<K, T>是一個在哈希表中存儲鍵值對的數據結構。它的接口幾乎與QMap<K, T>相同,但是與QMap<K, T>相比,它對K的模板類型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。
????除了對存儲在容器類中的所有值類型的一般要求,QHash<K, T>中K的值類型還需要提供一個operator==(),并需要一個能夠為鍵返回哈希值的全局qHash()函數的支持。Qt已經為qHash()函數提供了對整型、指針型、QChar、QString以及QByteArray。
??? QHash<K, T>為它內部的哈希表自動分配最初的存儲區域,并在有項被插入或者刪除時重新劃分所分配的存儲區域的大小。也可以通過調用reserve()或者squeeze()來指定或者壓縮希望存儲到哈希表中的項的數目,以進行性能調整。通常的做法是利用我們預期的最大的項的數目來條用reserve(),然后插入數據,最后如果有多出的項,則調用squeeze()以使內存的使用減到最小。
????雖然哈希表通常都是單一值的,但是使用insertMulti()函數或者MultiHash<K, T>方便的子類,也可以將多個值賦給同一個鍵。
????除了QHash<K, T>之外,Qt還提供了一個用來高速緩存與鍵相關聯的對象的QCache<K, T>類以及僅僅存儲鍵的QSet<K>容器。在內部,它們都依賴于QHash<K, T>,且都像QHash<K, T>一樣對K的類型有相同的要求。
????最簡便的遍歷存儲在關聯容器中多有鍵值對的方式是使用Java風格的迭代器。因為迭代器必須能同時訪問鍵和值,針對關聯容器的Java風格的迭代器與連續容器的在運作方式有些差異。只要區別在于next()和previous()函數返回一個代表鍵值對的對象,而不是一個簡單的值。我們可以使用key()和value()分別從這個對象中獲得鍵和值。例如:
QMap<QString, int> map;
...
int sum = 0;
QMapIterator<QString, int> i(map);
while (i.hasNext())
??? sum += i.next().value();
??? 如果需要同時存取鍵和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函數,它們都是針對最后被跳過的項進行操作的:
QMapIterator<QString, int> i(map);
while(i.hasNext()){
??? i.next();
??? if (i.value() > largestValue){
??????? largestKey = i.key();
??????? largestValue = i.value();
??? }
}???
?
===========================================================================================
原文鏈接:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html
QMap提供了一個從類項為key的鍵到類項為T的直的映射,通常所存儲的數據類型是一個鍵對應一個直,并且按照Key的次序存儲數據,
這個類也支持一鍵多值的情況,用類QMultiMap
QHash具有和QMap幾乎完全一樣的APi,此類維護這一張哈希表,表的大小和數據項是自適應的,QHash是以任意的順序住址他的數據,,當然了他也是可以支持一鍵多值的,QMultiHash
兩種之間的區別是:
QHash查找速度上顯著于QMap
QHash以任意的方式進行存儲,而QMap則是以key順序進行存儲
Qhash 的鍵類型必須提供operator==()和一個全局的qHash(key)函數。而QMap的鍵類型key必須提供operator<()函數
他們同樣也是有兩種風格的迭代容器。用來進行遍歷的。。
STL 風格的
下面以一個例子來進行說明:
#include <QDebug>int?main(int?argc,?char?*argv[])
{
? ??QMap<QString, QString>?map;
? ? map.insert("beijing",?"111");
? ? map.insert("shanghai",?"021");
? ? map.insert("tianjin",?"022");
? ? map.insert("chongqing",?"023");
? ? map.insert("jinan",?"0531");
? ? map.insert("wuhan",?"027");???
QMap<QString, QString>::const_iterator?i;
? ??for(?i=map.constBegin();?i!=map.constEnd();?++i)
? ? ? ? qDebug()?<<?i.key()?<<" ? ? ? ?"?<<?i.value();???
? ? ? ?
? ? QMap<QString, QString>::iterator?mi;
? ? mi?=?map.find("beijing");
? ??if(mi?!=?map.end())
? ? ? ? mi.value()?=?"010";
? ? QMap<QString, QString>::const_iterator?modi;
? ? qDebug()?<<?"";
? ??for(?modi=map.constBegin();?modi!=map.constEnd();?++modi)
? ? ? ? qDebug()?<<?modi.key()?<<" ? ? ? ?"?<<?modi.value();???
? ??return?0;
}
轉載于:https://www.cnblogs.com/senior-engineer/p/8287362.html
總結
以上是生活随笔為你收集整理的QMap与QHash的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携带cookie进行数据请求
- 下一篇: flannel无法跨主机ping通容器的