詳解 Qt 中各種豐富容器類
數(shù)組、鏈表、哈希……各種容器類,在C++里做大型程序時(shí),少不了要與數(shù)組、鏈表等數(shù)據(jù)結(jié)構(gòu)打交道。就是最簡(jiǎn)單的字符串也常常讓頭痛萬(wàn)分,Qt中有QString解決了字符串的頭痛,那么其他數(shù)組等有沒(méi)有更簡(jiǎn)單的解決方案呢?
Qt作為一款優(yōu)秀的類型庫(kù),當(dāng)然不會(huì)沒(méi)考慮這些。Qt提供了大量的“容器類”,專門用于以某種方式存儲(chǔ)大量?jī)?nèi)容,QString其實(shí)只是這大量的容器類的一種。
QVector(數(shù)組)、QLinkedList(鏈表)、QMap(映射表)、QHash(哈希表)
QVector,是Qt對(duì)所有數(shù)組的封裝,比如我們想要一個(gè)int類型數(shù)組,我們?cè)葧?huì)寫int array[10],我們?cè)赒t里可以寫QVector<int> array(10)
賦值的時(shí)候,我們依然可以照舊array[5]=4;想獲取某一項(xiàng)的值也還可以array[9],也就是說(shuō),原來(lái)的特性我們還可以用。
那么QVector有什么好處呢?
我們可以用count函數(shù)獲知數(shù)組中有多少個(gè)元素,方便遍歷
原先我們必須預(yù)定義好大小,而用QVector我們雖然最好也先定義好大小,但是預(yù)先不定義也可以。
我們可以使用append函數(shù)或者<<操作符來(lái)在數(shù)組最后端添加元素而不用擔(dān)心溢出問(wèn)題。
比如:
- view sourceprint?01 #include<QVector>
- ...
- void someFunction()
- {
- QVector<QString> strArray;
- strArray.append("Hello");
- strArray<<"World!";
- strArray<<"也可以一行"<<"加多個(gè)元素"<<"這里一次加了3個(gè)";
- //現(xiàn)在strArray總共有5個(gè)字符串元素,strArray.count()==5
- }
- ...
當(dāng)我們想要在某一項(xiàng)前面插入元素時(shí),我們可以使用insert,比如strArray.insert(1,"我在Hello與World之間");
QLinkedList。鏈表是大部分人極為頭痛的內(nèi)容,各種節(jié)點(diǎn)、內(nèi)存地址之類的搞得人不勝其亂。但是QLinkedList使用起來(lái)輕松愉快,聲明一個(gè)鏈表與數(shù)組類似,可以這樣QLinkedList<QVector<int>>,QVector<QLinkedList<QLinkedList<double>>>,只要?jiǎng)e把自己搞亂……
數(shù)組在末端插入元素是高效的但是在中間插入?yún)s是較慢的,QList在任何地方插入都是等速的,但是訪問(wèn)某個(gè)元素時(shí)并不方便,所以我個(gè)人更推崇另一種“鏈表”類型QList,與其說(shuō)他是鏈表,其實(shí)他是個(gè)指針數(shù)組,所有數(shù)組的用法QList也一樣用,不過(guò)他的原理什么的就不用知道的那么多了,知道用法跟QVector差不多一樣就行了。有時(shí)數(shù)組中的每一個(gè)元素較龐大的話,建議使用QList而不是QVector。
QMap是個(gè)有趣的東西,想在裸露的底層C++實(shí)現(xiàn)它頗為麻煩。數(shù)組建立的是從0開(kāi)始的連續(xù)數(shù)字與數(shù)據(jù)的對(duì)應(yīng)關(guān)系,而QMap的作用就是,讓任意一種數(shù)據(jù)類型對(duì)應(yīng)于另一種數(shù)據(jù)類型。聲明時(shí)如此:QMap<索引類型,數(shù)據(jù)類型> 變量名。他的表現(xiàn)有點(diǎn)類似于PHP編程的array
比如:
- view sourceprint?01 #include<QMap>
- ...
- void someFunction()
- {
- QMap<QString,QString> map;
- map["Hello"]="World";
- QMap<int,double> i2d;
- i2d[5231]=32.4213;
- //遍歷比較特殊,得這樣:
- QMapIterator<QString,QString> i(map);
- while(i.hasNext())
- doSomething(i.next());
- }
如果我們想用[]操作符訪問(wèn)某一項(xiàng),但那一項(xiàng)并不存在,那就會(huì)自動(dòng)創(chuàng)建,如果不想創(chuàng)建空白項(xiàng)可以使用value函數(shù),如i2d.value(123,-0.1);這里如果i2d[123]存在的話就返回那一項(xiàng),否則返回默認(rèn)值-0.1,這個(gè)默認(rèn)值可以不寫,那樣Qt系統(tǒng)就會(huì)使用Qt默認(rèn)的默認(rèn)值……??梢杂胻ake函數(shù)(讓人糾結(jié)的函數(shù)名)來(lái)刪除某一項(xiàng)。
QHash哈希表,與QMap幾乎一樣,但是它更高效,不過(guò)使用QHash要求作為索引的類型可以用==比較并且有對(duì)應(yīng)的函數(shù)qHash,Qt里面自帶了一部分,比如QString、各類整數(shù)、指針、QByteArray、QChar等都可以直接作為QHash的索引。因?yàn)镼Hash更高效,所以建議盡量使用QHash。
QMap與QHash都是一對(duì)一或多對(duì)以的映射,可以使用QMultiMap與QMultiHash建立一對(duì)多的映射。比如
- QMultiMap <int,QString> map;
- map[3]="Hello";
- map.insert(3,"World");
調(diào)用map[3]時(shí),就會(huì)得到一個(gè)QList<QString>類型的變量。
遍歷時(shí)依然可用 QMapIterator
小結(jié):文章分別從QVector(數(shù)組)、QLinkedList(鏈表)、QMap(映射表)、QHash(哈希表)一一介紹,那么到這里,Qt 中各種豐富容器類 的內(nèi)容介紹完了,最后希望本文對(duì)你有所幫助。