Qt學(xué)習(xí)總結(jié)(C魚(yú))之QList和QMap容器類

QList<T>

QList<T>容器是一個(gè)數(shù)組列表,特點(diǎn)如下:

創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,先為祿勸等服務(wù)建站,祿勸等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為祿勸企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

1.大多數(shù)情況下可以用QList。像prepend()、append()和insert()這種操作,通常QList比QVector快的多。這是因?yàn)镼List是基于index標(biāo)簽存儲(chǔ)它的元素項(xiàng)在內(nèi)存中(雖然內(nèi)存不連續(xù),這點(diǎn)與STL的list 是一樣的),比那種依賴iterator迭代的容器類更快捷,而且你的代碼也更少。

2.當(dāng)?shù)髦赶騋List中的一個(gè)項(xiàng)目后,如果QList進(jìn)行了插入或者刪除操作,那么這個(gè)迭代器就無(wú)效了。

3.QStringList類就是繼承QList<QString>容器類(注意QList<QString>其實(shí)是一個(gè)類模板,里面裝的是QString類型,然后又有一個(gè)QStringList類繼承于它)。

QList<T>容器的簡(jiǎn)單用法(由于QStringList是繼承于QList<String>,所以下面的所有用法對(duì)于QStringList容器一樣適用):

#include <QCoreApplication>
#include<QList>
#include<QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<QString> list;//創(chuàng)建了一個(gè)QList容器,容器內(nèi)部存儲(chǔ)QString類型的數(shù)據(jù),返回一個(gè)list對(duì)象,該對(duì)象有很多操作該容器的方法。
    list<<"aa"<<"bb"<<"cc";//可以采用<<的符號(hào)將數(shù)據(jù)輸入到容器內(nèi)存儲(chǔ)。
    if(list[1]=="bb")
    {
        list[1]="ab";
    }
    list.replace(2,"bc");//list對(duì)象的replace方法將指定索引位置的元素值替換成指定的類型值,參數(shù)1是list索引位置,參數(shù)2是指定替換的類型值。
    qDebug()<<"the list is:";
    for(int i=0;i<list.size();++i)//list對(duì)象的size方法返回該容器存儲(chǔ)的元素個(gè)數(shù)。
    {
        qDebug()<<list.at(i);//list對(duì)象的at方法訪問(wèn)容器內(nèi)指定索引位置的元素值。
    }
    list.append("dd");//調(diào)用list對(duì)象的append函數(shù)進(jìn)行尾插入指定類型值。
    list.prepend("mm");//調(diào)用list對(duì)象的prepend函數(shù)進(jìn)行頭插入指定類型值。
    QString str=list.takeAt(2);//調(diào)用list對(duì)象的takeAt函數(shù)刪除指定索引值的元素并彈出該刪除的類型值。
    qDebug()<<"at(2) item is:"<<str;
    qDebug()<<"the list is:";
    for(int i=0;i<list.size();++i)//list對(duì)象的size方法返回該容器存儲(chǔ)的元素個(gè)數(shù)。
    {
        qDebug()<<list.at(i);//list對(duì)象的at方法訪問(wèn)容器內(nèi)指定索引位置的元素值。
    }
    list.insert(2,"mm");//調(diào)用list對(duì)象的insert方法在指定索引位置插入指定的類型值,參數(shù)1是索引值,參數(shù)2是要插入的類型值。
    list.swap(1,3);//調(diào)用list對(duì)象的swap方法交換指定兩個(gè)索引位置的元素值。
    qDebug()<<"the list is:";
    for(int i=0;i<list.size();++i)//list對(duì)象的size方法返回該容器存儲(chǔ)的元素個(gè)數(shù)。
    {
        qDebug()<<list.at(i);//list對(duì)象的at方法訪問(wèn)容器內(nèi)指定索引位置的元素值。
    }
    qDebug()<<"contains'mm'?"<<list.contains("mm");//判斷列表中是否包含“mm”
    qDebug()<<"the 'mm' count:"<<list.count("mm");//容器內(nèi)包含“mm”的個(gè)數(shù)
    //第一個(gè)'mm'的位置,默認(rèn)從0索引位置開(kāi)始查找,找到就返回第一個(gè)匹配到的元素的索引位置
    qDebug()<<"the first 'mm' index:"<<list.indexOf("mm");
    //第二個(gè)'mm'的位置,我們指定從索引位置1開(kāi)始查找
    qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",1);
    return a.exec();
}

QMap<Key,T>

QMap<Key,T>容器是一個(gè)字典,屬于關(guān)聯(lián)容器的一種,特點(diǎn)如下:

1.它將Key類型的鍵值映射到T類型的值上,一般每個(gè)鍵關(guān)聯(lián)一個(gè)值,特殊情況出現(xiàn)于調(diào)用insertMulti函數(shù)插入多值。

2.并且它是根據(jù)鍵順序來(lái)存儲(chǔ)它的順序的。所以,QMap強(qiáng)調(diào)順序,那么如果你存儲(chǔ)的數(shù)據(jù)不關(guān)心存儲(chǔ)順序,可以考慮使用QHash來(lái)代替它。

QMap<Key,T>容器的簡(jiǎn)單用法():

#include <QCoreApplication>
#include<QMap>
#include<QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QMap<QString,int> map;//創(chuàng)建了一個(gè)QMap容器,容器內(nèi)存儲(chǔ)的鍵是QString類型,值是int類型,一個(gè)鍵只對(duì)應(yīng)一個(gè)值,并且存儲(chǔ)是講究鍵順序的。
    map["one"]=1;//當(dāng)給一個(gè)容器內(nèi)不存在的鍵賦值時(shí),會(huì)自動(dòng)將鍵和值添加進(jìn)容器內(nèi)
    map["three"]=3;
    map.insert("seven",7);//也可以使用insert來(lái)為容器添加鍵值對(duì)。

    int value1=map["six"];//當(dāng)采用鍵索引的方式訪問(wèn)鍵的值時(shí),若容器內(nèi)無(wú)該鍵,那么就會(huì)自動(dòng)插入該新鍵,并且值默認(rèn)設(shè)為0。
    qDebug()<<"value1:"<<value1;
    qDebug()<<"contains'six'?"<<map.contains("six");

    int value2=map.value("five");//調(diào)用value函數(shù),若指定要訪問(wèn)的鍵在容器內(nèi)找不到,那么不會(huì)自動(dòng)插入該新鍵,并且默認(rèn)返回0,函數(shù)的參數(shù)2可以指定返回的值。
    qDebug()<<"value2:"<<value2;
    qDebug()<<"contains'five'?"<<map.contains("five");

    int value3=map.value("nine",9);//函數(shù)的參數(shù)2指定返回的值。
    qDebug()<<"value3:"<<value3;

    //map默認(rèn)是一個(gè)鍵只對(duì)應(yīng)存在一個(gè)值,所以,如果重新給該鍵設(shè)置了值,那么以前的值就會(huì)被刪除替換,只保留最新的值。
    map.insert("ten",10);
    map.insert("ten",100);
    qDebug()<<"ten:"<<map.value("ten");

    /*
    map可以調(diào)用insertMulti函數(shù)來(lái)實(shí)現(xiàn)一鍵多值,值得注意的是,在QMap容器中,若存在某個(gè)鍵擁有多個(gè)值,那么調(diào)用平常的value和
    使用map[鍵名]索引的方式訪問(wèn)元素,那么實(shí)際上返回的就是調(diào)用insertMulti函數(shù)最后一次添加的值,而values函數(shù)是專門(mén)提供給
    一鍵多值的元素用來(lái)返回這個(gè)元素的所有存在的值形成的列表,這個(gè)列表可以使用QList來(lái)保存起來(lái)。
    */
    map.insertMulti("two",2);
    map.insertMulti("two",4);
    QList<int> values=map.values("two");
    qDebug()<<"two:"<<values;

    //上面是QMap容器對(duì)象調(diào)用insertMulti函數(shù)實(shí)現(xiàn)一鍵多值,其實(shí)有專門(mén)的容器類實(shí)現(xiàn)一鍵多值的操作和存儲(chǔ),例如:QMultimap
    //注意,這個(gè)QMultimap生成的一鍵多值對(duì)象和insertMulti函數(shù)實(shí)現(xiàn)的一鍵多值是有區(qū)別的,QMultimap對(duì)象不能夠索引方式訪問(wèn),但可以使用value函數(shù)來(lái)訪問(wèn)多值中最新的那個(gè)值,還有values函數(shù)可以返回該鍵對(duì)應(yīng)的所有值列表。
    QMultiMap<QString,int> map1,map2,map3;
    map1.insert("values",1);//插入values鍵,指定第一個(gè)值為1
    map1.insert("values",2);//再次為values鍵插入第二個(gè)值為2
    map1.insert("qwe",888);//后面插入操作以此類推
    map1.insert("qwe",999);
    map2.insert("values",3);
    map2.insert("rty",444);

    map3=map1+map2;//相當(dāng)于把map1對(duì)象內(nèi)存儲(chǔ)的values和qwe鍵(不管鍵對(duì)應(yīng)多值還是單值),還有map2對(duì)象存儲(chǔ)的values和rty鍵相合并然后全部放入到map3容器中。
    QList<int> myValues=map3.values("values");//QMultiMap容器類對(duì)象也跟QMap一樣擁有values函數(shù)來(lái)返回指定鍵的所有值的列表
    qDebug()<<"the values are:";
    for(int i=0;i<myValues.size();++i)
    {
        qDebug()<<myValues.at(i);
    }
    return a.exec();
}

遍歷容器(使用迭代器)

Qt容器類提供了兩種風(fēng)格的迭代器,分別是JAVA風(fēng)格迭代器和STL風(fēng)格迭代器。JAVA風(fēng)格迭代器有兩種數(shù)據(jù)類型,分別是只讀迭代器和讀/寫(xiě)迭代器。下面分別講解QList和QMap兩種容器類型的兩種迭代器。

QList容器的兩種迭代器

例如:

QList(容器類)->QListIterator(只讀迭代器)->QMutableListIterator(讀/寫(xiě)迭代器)

QListIterator(注意,JAVA風(fēng)格迭代器一直指向項(xiàng)目之間,不是直接指向項(xiàng)目)常用API:

  1. toFront():將迭代器移動(dòng)到List列表的最前面(第一個(gè)項(xiàng)目之前)。
  2. toBack():將迭代器移動(dòng)到List列表的最后面(最后一個(gè)項(xiàng)目之后)。
  3. hasNext():檢查該迭代器后面是否還有項(xiàng)目。
  4. next():迭代器向后移動(dòng),,返回它所跳過(guò)的項(xiàng)目。
  5. peekNext():迭代器不移動(dòng),返回它本來(lái)能跳過(guò)的項(xiàng)目。
  6. hasPrevious():檢查迭代器前面是否還有項(xiàng)目。
  7. previous:迭代器向前移動(dòng),返回它所跳過(guò)的項(xiàng)目。
  8. peekPrevious():迭代器不移動(dòng),返回它本來(lái)能跳過(guò)的項(xiàng)目。

上面的API,QMutableListIterator迭代器也都有,但由于QListIterator是只讀迭代器,所以沒(méi)有提供插入和刪除項(xiàng)目的函數(shù),而QMutableListIterator容器提供了insert和setValue函數(shù)來(lái)插入、設(shè)置值,remove函數(shù)來(lái)刪除項(xiàng)目。還有要注意的是QMutableListIterator容器雖然也有next和precious函數(shù),但是與QListIterator迭代器有所不同,前者的這兩個(gè)函數(shù)返回的是非const引用,說(shuō)明可以作為左值進(jìn)行賦值操作,而后者的兩個(gè)函數(shù)返回的是const引用,說(shuō)明不能用來(lái)賦值操作,只能用于讀取,很符合這個(gè)只讀迭代器的定義。下面給出QMutableListIterator迭代器三個(gè)操作項(xiàng)目的函數(shù)用法:

insert(value):在迭代器指向的位置插入一個(gè)項(xiàng)目。

setValue(value):這個(gè)函數(shù)是將指定項(xiàng)目的值設(shè)置成指定的值,所以必須有個(gè)前提就是前面執(zhí)行過(guò)next或者previous函數(shù),其實(shí)意思就是這個(gè)函數(shù)對(duì)上一次跳過(guò)的項(xiàng)目進(jìn)行賦值。

remove():刪除上一次跳過(guò)的項(xiàng)目。

案例代碼如下:

#include <QCoreApplication>
#include<QDebug>
#include<QList>
#include<QListIterator>
#include<QMutableListIterator>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<QString> list;//創(chuàng)建了一個(gè)QList容器對(duì)象
    list<<"A"<<"B"<<"C"<<"D";
    QListIterator<QString> i(list);//創(chuàng)建了一個(gè)指向QList的只讀迭代器,用list對(duì)象作為參數(shù)
    qDebug()<<"the forward is:";
    while(i.hasNext())
        qDebug()<<i.next();
    qDebug()<<"the backward is:";
    while(i.hasPrevious())
        qDebug()<<i.previous();

    QMutableListIterator<QString> j(list);//創(chuàng)建了一個(gè)讀/寫(xiě)迭代器
    j.toBack();
    while(j.hasPrevious()){
        QString str = j.previous();
        if(str=="B") j.remove();
    }
    /*
    要十分注意上面這個(gè)while循環(huán),其實(shí)原本是ABCD列表(假如從左到右排列),然后刪除B后,因?yàn)樽詈笥侄鄨?zhí)行了一次循環(huán)內(nèi)部代碼,所以迭代器就指向A的左側(cè)了。
    */
    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()<<j.next();
    return a.exec();
}

QMap容器的兩種迭代器

例如:

QMap(容器類)->QMapIterator(只讀迭代器)->QMutableMapIterator(讀/寫(xiě)迭代器)

與QListIterator迭代器類似,QMapIterator迭代器也提供了toFront()、toBack()、hasNext()、next()、peekNext()、hasPrevious()、previous()和peekPrevious()等函數(shù)。我們知道next()、peekNext()、previous()和peekPrevious()可以遍歷容器的內(nèi)容,但仔細(xì)想想,前面QList還好,只有一個(gè)值,容易理解直接遍歷取值就行,但是QMap可是字典,含有鍵值對(duì),那么該怎樣遍歷獲取鍵和值呢?next()、peekNext()、previous()和peekPrevious()這四個(gè)函數(shù)不再返回引用,而是直接返回項(xiàng)目對(duì)象??梢栽诜祷氐倪@個(gè)項(xiàng)目對(duì)象上分別使用key()和value()函數(shù)來(lái)獲取鍵和值,也可以使用QMapIterator對(duì)象的key()和value()函數(shù)獲取鍵和值,下面會(huì)有案例說(shuō)明兩者獲取方法的不同。
代碼如下:

#include <QCoreApplication>
#include<QDebug>
#include<QList>
#include<QListIterator>
#include<QMutableListIterator>
#include<QMap>
#include<QMapIterator>
#include<QMutableMapIterator>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QMap<QString,QString> map;
    map.insert("Paris","France");
    map.insert("Guatemala City","Guatemala");
    map.insert("Mexico City","Mexio");
    map.insert("Moscow","Russia");
    QMapIterator<QString,QString> i(map);//創(chuàng)建了一個(gè)只讀迭代器指向QMap對(duì)象
    while(i.hasNext()){
        i.next();
        /*
        注意,調(diào)用next函數(shù)后返回的是一個(gè)項(xiàng)目對(duì)象,可以使用這個(gè)項(xiàng)目對(duì)象的key()和value()方法獲取,
        例如:i.next().key()。但是對(duì)于這里的需求是我們需要獲取鍵和值,如果連續(xù)兩次執(zhí)行i.next().key()
        和i.next().value()那么迭代器就移動(dòng)兩次了,很明顯不符合我們的需求。其實(shí)當(dāng)單獨(dú)執(zhí)行了這個(gè)函數(shù),迭代器也向后移
        動(dòng)了一次,并且內(nèi)部已經(jīng)保存了跳過(guò)的
        項(xiàng)目的鍵和值,它告訴我們可以通過(guò)i對(duì)象的key()和
        value()函數(shù)獲取。就好像下面那條語(yǔ)句一樣。
        */
        qDebug()<<i.key()<<":"<<i.value();
    }
    qDebug()<<"--------------------";
    if(i.findPrevious("Mexico")) qDebug()<<"find 'Mexico'";
    QMutableMapIterator<QString,QString> j(map);
    while(j.hasNext()){
        //下面的j.next.key()語(yǔ)句可以看出,就是我們上面介紹的那樣,不過(guò)這里的應(yīng)用場(chǎng)景是為了只單獨(dú)獲取鍵,然后匹配以City的項(xiàng)目后再刪除。
        if(j.next().key().endsWith("City"))
            j.remove();
    }
    while(j.hasPrevious()){
        j.previous();
        qDebug()<<j.key()<<":"<<j.value();
    }
    return a.exec();
}

分享名稱:Qt學(xué)習(xí)總結(jié)(C魚(yú))之QList和QMap容器類
當(dāng)前URL:http://bm7419.com/article10/igdpgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、定制網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、標(biāo)簽優(yōu)化小程序開(kāi)發(fā)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化