十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
QList

創(chuàng)新互聯2013年開創(chuàng)至今,先為祿勸等服務建站,祿勸等地企業(yè),進行企業(yè)商務咨詢服務。為祿勸企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
1.大多數情況下可以用QList。像prepend()、append()和insert()這種操作,通常QList比QVector快的多。這是因為QList是基于index標簽存儲它的元素項在內存中(雖然內存不連續(xù),這點與STL的list 是一樣的),比那種依賴iterator迭代的容器類更快捷,而且你的代碼也更少。
2.當迭代器指向QList中的一個項目后,如果QList進行了插入或者刪除操作,那么這個迭代器就無效了。
3.QStringList類就是繼承于QList
容器類(注意QList 其實是一個類模板,里面裝的是QString類型,然后又有一個QStringList類繼承于它)。
QList
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList list;//創(chuàng)建了一個QList容器,容器內部存儲QString類型的數據,返回一個list對象,該對象有很多操作該容器的方法。
list<<"aa"<<"bb"<<"cc";//可以采用<<的符號將數據輸入到容器內存儲。
if(list[1]=="bb")
{
list[1]="ab";
}
list.replace(2,"bc");//list對象的replace方法將指定索引位置的元素值替換成指定的類型值,參數1是list索引位置,參數2是指定替換的類型值。
qDebug()<<"the list is:";
for(int i=0;i
QMap
1.它將Key類型的鍵值映射到T類型的值上,一般每個鍵關聯一個值,特殊情況出現于調用insertMulti函數插入多值。
2.并且它是根據鍵順序來存儲它的順序的。所以,QMap強調順序,那么如果你存儲的數據不關心存儲順序,可以考慮使用QHash來代替它。
QMap
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap map;//創(chuàng)建了一個QMap容器,容器內存儲的鍵是QString類型,值是int類型,一個鍵只對應一個值,并且存儲是講究鍵順序的。
map["one"]=1;//當給一個容器內不存在的鍵賦值時,會自動將鍵和值添加進容器內
map["three"]=3;
map.insert("seven",7);//也可以使用insert來為容器添加鍵值對。
int value1=map["six"];//當采用鍵索引的方式訪問鍵的值時,若容器內無該鍵,那么就會自動插入該新鍵,并且值默認設為0。
qDebug()<<"value1:"< values=map.values("two");
qDebug()<<"two:"< map1,map2,map3;
map1.insert("values",1);//插入values鍵,指定第一個值為1
map1.insert("values",2);//再次為values鍵插入第二個值為2
map1.insert("qwe",888);//后面插入操作以此類推
map1.insert("qwe",999);
map2.insert("values",3);
map2.insert("rty",444);
map3=map1+map2;//相當于把map1對象內存儲的values和qwe鍵(不管鍵對應多值還是單值),還有map2對象存儲的values和rty鍵相合并然后全部放入到map3容器中。
QList myValues=map3.values("values");//QMultiMap容器類對象也跟QMap一樣擁有values函數來返回指定鍵的所有值的列表
qDebug()<<"the values are:";
for(int i=0;i
Qt容器類提供了兩種風格的迭代器,分別是JAVA風格迭代器和STL風格迭代器。JAVA風格迭代器有兩種數據類型,分別是只讀迭代器和讀/寫迭代器。下面分別講解QList和QMap兩種容器類型的兩種迭代器。
例如:
QList(容器類)->QListIterator(只讀迭代器)->QMutableListIterator(讀/寫迭代器)
QListIterator(注意,JAVA風格迭代器一直指向項目之間,不是直接指向項目)常用API:
上面的API,QMutableListIterator迭代器也都有,但由于QListIterator是只讀迭代器,所以沒有提供插入和刪除項目的函數,而QMutableListIterator容器提供了insert和setValue函數來插入、設置值,remove函數來刪除項目。還有要注意的是QMutableListIterator容器雖然也有next和precious函數,但是與QListIterator迭代器有所不同,前者的這兩個函數返回的是非const引用,說明可以作為左值進行賦值操作,而后者的兩個函數返回的是const引用,說明不能用來賦值操作,只能用于讀取,很符合這個只讀迭代器的定義。下面給出QMutableListIterator迭代器三個操作項目的函數用法:
insert(value):在迭代器指向的位置插入一個項目。
setValue(value):這個函數是將指定項目的值設置成指定的值,所以必須有個前提就是前面執(zhí)行過next或者previous函數,其實意思就是這個函數對上一次跳過的項目進行賦值。
remove():刪除上一次跳過的項目。
案例代碼如下:
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList list;//創(chuàng)建了一個QList容器對象
list<<"A"<<"B"<<"C"<<"D";
QListIterator i(list);//創(chuàng)建了一個指向QList的只讀迭代器,用list對象作為參數
qDebug()<<"the forward is:";
while(i.hasNext())
qDebug()< j(list);//創(chuàng)建了一個讀/寫迭代器
j.toBack();
while(j.hasPrevious()){
QString str = j.previous();
if(str=="B") j.remove();
}
/*
要十分注意上面這個while循環(huán),其實原本是ABCD列表(假如從左到右排列),然后刪除B后,因為最后又多執(zhí)行了一次循環(huán)內部代碼,所以迭代器就指向A的左側了。
*/
j.insert("Q");
j.toBack();
if(j.hasPrevious()) j.previous()="N";
j.previous();
j.setValue("M");
j.toFront();
qDebug()<<"the forward is:";
while(j.hasNext())
qDebug()<
例如:
QMap(容器類)->QMapIterator(只讀迭代器)->QMutableMapIterator(讀/寫迭代器)
與QListIterator迭代器類似,QMapIterator迭代器也提供了toFront()、toBack()、hasNext()、next()、peekNext()、hasPrevious()、previous()和peekPrevious()等函數。我們知道next()、peekNext()、previous()和peekPrevious()可以遍歷容器的內容,但仔細想想,前面QList還好,只有一個值,容易理解直接遍歷取值就行,但是QMap可是字典,含有鍵值對,那么該怎樣遍歷獲取鍵和值呢?next()、peekNext()、previous()和peekPrevious()這四個函數不再返回引用,而是直接返回項目對象。可以在返回的這個項目對象上分別使用key()和value()函數來獲取鍵和值,也可以使用QMapIterator對象的key()和value()函數獲取鍵和值,下面會有案例說明兩者獲取方法的不同。
代碼如下:
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap map;
map.insert("Paris","France");
map.insert("Guatemala City","Guatemala");
map.insert("Mexico City","Mexio");
map.insert("Moscow","Russia");
QMapIterator i(map);//創(chuàng)建了一個只讀迭代器指向QMap對象
while(i.hasNext()){
i.next();
/*
注意,調用next函數后返回的是一個項目對象,可以使用這個項目對象的key()和value()方法獲取,
例如:i.next().key()。但是對于這里的需求是我們需要獲取鍵和值,如果連續(xù)兩次執(zhí)行i.next().key()
和i.next().value()那么迭代器就移動兩次了,很明顯不符合我們的需求。其實當單獨執(zhí)行了這個函數,迭代器也向后移
動了一次,并且內部已經保存了跳過的
項目的鍵和值,它告訴我們可以通過i對象的key()和
value()函數獲取。就好像下面那條語句一樣。
*/
qDebug()< j(map);
while(j.hasNext()){
//下面的j.next.key()語句可以看出,就是我們上面介紹的那樣,不過這里的應用場景是為了只單獨獲取鍵,然后匹配以City的項目后再刪除。
if(j.next().key().endsWith("City"))
j.remove();
}
while(j.hasPrevious()){
j.previous();
qDebug()<