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