Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用
在Qt中,有幾種關(guān)聯(lián)容器可供選擇:
QMap:QMap是一個(gè)關(guān)聯(lián)容器,存儲(chǔ)鍵-值對,并根據(jù)鍵自動(dòng)進(jìn)行排序。它提供了快速的查找和插入操作,適用于需要根據(jù)鍵進(jìn)行排序和搜索的場景。
QMultiMap:QMultiMap是一個(gè)關(guān)聯(lián)容器,類似于QMap,但允許有重復(fù)的鍵。它還保了插入元素的順序,可通過迭代器進(jìn)行遍歷。
QHash:QHash是一個(gè)關(guān)聯(lián)容器,根據(jù)鍵的哈希值進(jìn)行快速查找和插入操作。它不會(huì)對鍵進(jìn)行排序,適用于需要快速查找的場景。
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ǔ)和管理數(shù)據(jù)。需要注意的是,這些容器都是基于Qt的容器類提供的,并且為了方便使用,它們也提供了類似STL容器的接口和使用方式。
1.QMap:QMap 是一個(gè)有序的關(guān)聯(lián)容器,它根據(jù)鍵的排序來存儲(chǔ)鍵-值對。示例用法如下:
#include <QMap> #include <QDebug> int main() { QMap<int, QString> map; // 插入鍵值對 map.insert(1, "Apple"); map.insert(2, "Banana"); map.insert(3, "Orange"); // 通過鍵查找值 qDebug() << map.value(2); // 遍歷所有鍵值對 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ù)來查找鍵-值對。示例用法如下:
#include <QHash> #include <QDebug> int main() { QHash<QString, int> hash; // 插入鍵值對 hash.insert("Apple", 10); hash.insert("Banana", 20); hash.insert("Orange", 30); // 通過鍵查找值 qDebug() << hash.value("Banana"); // 遍歷所有鍵值對 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; // 插入鍵值對 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對象,并通過insert函數(shù)插入了一些鍵值對。然后,我們使用迭代器循環(huán)遍歷整個(gè)multimap,并使用equal_range函數(shù)查找與鍵關(guān)聯(lián)的元素范圍。
4.以下是一個(gè)使用QMultiHash的示例用法:
#include <QMultiHash> #include <QDebug> int main() { QMultiHash<int, QString> multiHash; // 向多重哈希表插入鍵-值對 multiHash.insert(1, "Apple"); multiHash.insert(2, "Banana"); multiHash.insert(1, "Orange"); multiHash.insert(3, "Grape"); // 遍歷所有鍵值對 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對象,并使用insert函數(shù)向哈希表中插入了多個(gè)鍵-值對。注意,由于QMultiHash允許存在重復(fù)的鍵,因此可以插入多個(gè)具有相同鍵的值。然后,我們使用迭代器遍歷了整個(gè)多重哈希表,并打印出每個(gè)鍵值對。
接著,我們演示了如何使用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ù)的有序性,適合需要保持插入順序的場景。迭代器順序:
QMultiHash
迭代器的順序是不確定的,而QMultiMap
的迭代器是根據(jù)鍵的排序順序進(jìn)行遍歷的,因?yàn)?code>QMultiMap使用紅黑樹實(shí)現(xiàn)了基于排序的容器。接口差異:盡管兩者提供了類似的接口,包括插入、查找、刪除等功能,但在一些特定操作上有所不同,比如
QMultiHash
的values
函數(shù)返回一個(gè)列表,但對于QMap
,您可以使用find
函數(shù)查找特定鍵的范圍。
根據(jù)需求,您可以選擇QMultiHash
或QMultiMap
來適應(yīng)不同的場景。如果需要快速的插入和查找操作,并且鍵的順序并不重要,QMultiHash
是更好的選擇。而如果需要保持有序并且對鍵的順序有要求,QMultiMap
更適合。
到此這篇關(guān)于Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用的文章就介紹到這了,更多相關(guān)Qt QMap,QMultiMap,QHash,QMultiHash內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++編程中刪除運(yùn)算符與相等運(yùn)算符的使用解析
這篇文章主要介紹了C++編程中刪除運(yùn)算符與相等運(yùn)算符的使用解析,delete和==以及!=運(yùn)算符的使用是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01C語言函數(shù)調(diào)用底層實(shí)現(xiàn)原理分析
這篇文章主要介紹了C語言函數(shù)調(diào)用底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號(hào)的解決方法
本篇文章是對在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號(hào)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05