Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用
在Qt中,有幾種關(guān)聯(lián)容器可供選擇:
QMap:QMap是一個(gè)關(guān)聯(lián)容器,存儲(chǔ)鍵-值對(duì),并根據(jù)鍵自動(dòng)進(jìn)行排序。它提供了快速的查找和插入操作,適用于需要根據(jù)鍵進(jìn)行排序和搜索的場(chǎng)景。
QMultiMap:QMultiMap是一個(gè)關(guān)聯(lián)容器,類似于QMap,但允許有重復(fù)的鍵。它還保了插入元素的順序,可通過迭代器進(jìn)行遍歷。
QHash:QHash是一個(gè)關(guān)聯(lián)容器,根據(jù)鍵的哈希值進(jìn)行快速查找和插入操作。它不會(huì)對(duì)鍵進(jìn)行排序,適用于需要快速查找的場(chǎng)景。
QMultiHash:QMultiHash是一個(gè)關(guān)聯(lián)容器,類似于QHash,但允許有重復(fù)的鍵。它還保留了插入元素的順序,可以通過迭代器進(jìn)行遍歷。
這些關(guān)聯(lián)容器在Qt中提供了靈活而強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)選項(xiàng),根據(jù)具體的需求和使用場(chǎng)景,您可以選擇適合的容器來存儲(chǔ)和管理數(shù)據(jù)。需要注意的是,這些容器都是基于Qt的容器類提供的,并且為了方便使用,它們也提供了類似STL容器的接口和使用方式。
1.QMap:QMap 是一個(gè)有序的關(guān)聯(lián)容器,它根據(jù)鍵的排序來存儲(chǔ)鍵-值對(duì)。示例用法如下:
#include <QMap> #include <QDebug> int main() { QMap<int, QString> map; // 插入鍵值對(duì) map.insert(1, "Apple"); map.insert(2, "Banana"); map.insert(3, "Orange"); // 通過鍵查找值 qDebug() << map.value(2); // 遍歷所有鍵值對(duì) for(auto it = map.begin(); it != map.end(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } return 0; }
2.QHash:QHash 是一個(gè)無序的關(guān)聯(lián)容器,通過哈希函數(shù)來查找鍵-值對(duì)。示例用法如下:
#include <QHash> #include <QDebug> int main() { QHash<QString, int> hash; // 插入鍵值對(duì) hash.insert("Apple", 10); hash.insert("Banana", 20); hash.insert("Orange", 30); // 通過鍵查找值 qDebug() << hash.value("Banana"); // 遍歷所有鍵值對(duì) QHash<QString, int>::iterator it; for(it = hash.begin(); it != hash.end(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } return 0; }
3.QMultiMap:QMultiMap 是一個(gè)允許有重復(fù)鍵的有序關(guān)聯(lián)容器。示例用法如下:
#include <QMultiMap> #include <QString> #include <QDebug> int main() { QMultiMap<int, QString> multimap; // 插入鍵值對(duì) multimap.insert(1, "apple"); multimap.insert(2, "banana"); multimap.insert(1, "orange"); multimap.insert(3, "grape"); // 使用迭代器遍歷multimap qDebug() << "Multimap elements:"; for (auto it = multimap.begin(); it != multimap.end(); ++it) { qDebug() << it.key() << "->" << it.value(); } // 使用equal_range函數(shù)查找與鍵關(guān)聯(lián)的元素范圍 auto range = multimap.equal_range(1); qDebug() << "Elements with key 1:"; for (auto it = range.first; it != range.second; ++it) { qDebug() << it.key() << "->" << it.value(); } return 0; }
輸出為:
Multimap elements: 1 -> "apple1 -> "orange" 2 -> "banana" 3 -> "grape" Elements with key 1: 1 -> "apple" 1 -> "orange"
在上述示例中,我們使用QMultiMap類創(chuàng)建了一個(gè)multimap對(duì)象,并通過insert函數(shù)插入了一些鍵值對(duì)。然后,我們使用迭代器循環(huán)遍歷整個(gè)multimap,并使用equal_range函數(shù)查找與鍵關(guān)聯(lián)的元素范圍。
4.以下是一個(gè)使用QMultiHash的示例用法:
#include <QMultiHash> #include <QDebug> int main() { QMultiHash<int, QString> multiHash; // 向多重哈希表插入鍵-值對(duì) multiHash.insert(1, "Apple"); multiHash.insert(2, "Banana"); multiHash.insert(1, "Orange"); multiHash.insert(3, "Grape"); // 遍歷所有鍵值對(duì) for(auto it = multiHash.begin(); it != multiHash.end(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } // 查找特定鍵的值 int key = 1; QList<QString> values = multiHash.values(key); qDebug() << "Values for key" << key << ":" << values; return 0; }
在上述示例中,我們創(chuàng)建了一個(gè)QMultiHash對(duì)象,并使用insert函數(shù)向哈希表中插入了多個(gè)鍵-值對(duì)。注意,由于QMultiHash允許存在重復(fù)的鍵,因此可以插入多個(gè)具有相同鍵的值。然后,我們使用迭代器遍歷了整個(gè)多重哈希表,并打印出每個(gè)鍵值對(duì)。
接著,我們演示了如何使用values函數(shù)來查找特定鍵的所有值,并將它們存儲(chǔ)在一個(gè)QList中。
那么有一個(gè)問題,QMultiHash和QMultiMap到底有哪些區(qū)別?
QMultiHash
和QMultiMap
是Qt提供的兩種關(guān)聯(lián)容器,它們都允許鍵的重復(fù),但在實(shí)現(xiàn)和使用上有一些區(qū)別:
數(shù)據(jù)結(jié)構(gòu):
QMultiHash
使用哈希表作為其底層數(shù)據(jù)結(jié)構(gòu),而QMultiMap
使用有序的紅黑樹。由于哈希表的特性,QMultiHash
在插入和查找操作上通常比QMultiMap
更快,因?yàn)樗褂霉:瘮?shù)進(jìn)行數(shù)據(jù)存儲(chǔ)和問。而QMultiMap
能夠保持?jǐn)?shù)據(jù)的有序性,適合需要保持插入順序的場(chǎng)景。迭代器順序:
QMultiHash
迭代器的順序是不確定的,而QMultiMap
的迭代器是根據(jù)鍵的排序順序進(jìn)行遍歷的,因?yàn)?code>QMultiMap使用紅黑樹實(shí)現(xiàn)了基于排序的容器。接口差異:盡管兩者提供了類似的接口,包括插入、查找、刪除等功能,但在一些特定操作上有所不同,比如
QMultiHash
的values
函數(shù)返回一個(gè)列表,但對(duì)于QMap
,您可以使用find
函數(shù)查找特定鍵的范圍。
根據(jù)需求,您可以選擇QMultiHash
或QMultiMap
來適應(yīng)不同的場(chǎng)景。如果需要快速的插入和查找操作,并且鍵的順序并不重要,QMultiHash
是更好的選擇。而如果需要保持有序并且對(duì)鍵的順序有要求,QMultiMap
更適合。
到此這篇關(guān)于Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用的文章就介紹到這了,更多相關(guān)Qt QMap,QMultiMap,QHash,QMultiHash內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++如何實(shí)現(xiàn)在Word文檔中創(chuàng)建列表
這篇文章主要為大家詳細(xì)介紹了介紹如何使用C++在Word文檔中創(chuàng)建編號(hào)列表、項(xiàng)目符號(hào)列表和多級(jí)列表,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05全局靜態(tài)存儲(chǔ)區(qū)、堆區(qū)和棧區(qū)深入剖析
在C++中,內(nèi)存可分為系統(tǒng)數(shù)據(jù)區(qū),自由存儲(chǔ)區(qū),文本區(qū),const數(shù)據(jù)區(qū),全局靜態(tài)區(qū),堆區(qū)和棧區(qū)2012-11-11C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出
今天小編就為大家分享一篇關(guān)于C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12C++中strcpy和memcpy的區(qū)別小結(jié)
C++中strcpy和memcpy是兩個(gè)用于數(shù)據(jù)拷貝的函數(shù),但它們的設(shè)計(jì)目標(biāo)、行為邏輯和適用場(chǎng)景有顯著差異,下面就來介紹一下兩者的區(qū)別,感興趣的可以了解一下2025-07-07