QT—常用容器 QStringList,QVector,QMap,QHash,QVariant
QStringList
元素添加
可以直接添加元素,也可也使用append( )方法在末尾追加元素
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; weekList.append("星期四"); qDebug()<<weekList;元素遍歷?
?for循環(huán)遍歷
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; for(int i=0;i<weekList.size();++i){qDebug()<<weekList[i] <<weekList.at(i); }foreach遍歷
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; foreach (QString s, weekList) {qDebug()<<s; }迭代器遍歷
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; QStringList::iterator iter=weekList.begin(); for(;iter!=weekList.end();++iter){qDebug()<<*iter; }Java風(fēng)格遍歷
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; //字符串類(lèi)型的鏈表迭代器 QListIterator<QString> itr(weekList); while(itr.hasNext()){qDebug()<<itr.next(); }鏈表查找
使用contains( )方法可以查找數(shù)組中是否包含該字符串
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; qDebug()<<"鏈表中有星期二:"<<weekList.contains("星期二"); qDebug()<<"鏈表中有星期五:"<<weekList.contains("星期五");鏈表插入元素
使用insert( )方法可以向鏈表中插入元素,insert( )方法第一個(gè)參數(shù)表示插入的位置,第二個(gè)參數(shù)表示要插入的數(shù)據(jù)
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; weekList.insert(4,"星期五"); qDebug()<<weekList;鏈表刪除元素
removeFirst( )方法可以刪除鏈表頭
removeLast( )方法可以刪除鏈表尾
removeOne(str)方法可以刪除指定元素
removeAt(int)可以刪除指定位置元素
clear( )方法可以清空鏈表?
QStringList weekList<<"星期一"<<"星期二"<<"星期二"<<"星期二"<<"星期三"<<"星期四"<<"星期五"; qDebug()<<weekList; //5.鏈表刪除元素 weekList.removeFirst();//刪除頭 qDebug()<<"刪除鏈表頭:"<<weekList; weekList.removeLast();//刪除尾 qDebug()<<"刪除鏈表尾:"<<weekList; weekList.removeOne("星期一");//刪除指定元素 qDebug()<<"刪除指定元素星期二:"<<weekList; weekList.removeAt(1);//刪除指定位置 qDebug()<<"刪除3位置元素:"<<weekList; weekList.clear();//清空鏈表 qDebug()<<"清空鏈表:"<<weekList;QVector?
QVector在相鄰的內(nèi)存中存儲(chǔ)給定數(shù)據(jù)類(lèi)型T的一組數(shù)據(jù)。在QVector前部或中間位置插入操作速度都很慢,因會(huì)導(dǎo)致內(nèi)存中大量的數(shù)據(jù)移動(dòng)。訪問(wèn)數(shù)據(jù)可使用下標(biāo),也可使用迭代器。繼承自QVector類(lèi)的子類(lèi)有QPolygon、QPolygonF、QStack。
添加元素
QVector<QString> vPeople; //添加元素 vPeople<<"小明"<<"小王"<<"小李"; vPeople.push_back("小孫"); vPeople.append("小張");//尾加 vPeople.prepend("人物:");//頭加 vPeople.insert(5,"小麗"); qDebug()<<vPeople;修改刪除元素
QVector<QString> vPeople; vPeople<<"小明"<<"小王"<<"小李"<<"小孫"<<"小張"; qDebug()<<"修改前"<<vPeople; //修改刪除元素 vPeople.replace(2,"無(wú)名氏");//修改元素 vPeople.removeLast();//刪除元素 vPeople.remove(1); //刪除指定位置元素 vPeople.removeAll("小明");//刪除所有的指定元素 qDebug()<<"修改后:"<<vPeople;下標(biāo)索引和判斷鏈表是否包含某個(gè)元素
QVector<QString> vPeople; vPeople<<"小明"<<"小王"<<"小李"<<"小孫"<<"小張"; qDebug()<<"第三個(gè)People:"<<vPeople[2]; qDebug()<<"是否有小明:"<<vPeople.contains("小明");Java風(fēng)格的遍歷和讀寫(xiě)?
QVector<QString> vPeople; vPeople<<"小明"<<"小王"<<"小李"<<"小孫"<<"小張"; qDebug()<<"只讀遍歷:"; QVectorIterator<QString> it_sr(vPeople); for(it_sr.toFront();it_sr.hasNext();){qDebug()<<it_sr.next(); }QMutableVectorIterator<QString> it_srw(vPeople); for(it_srw.toFront();it_srw.hasNext();){QString str=it_srw.next();if(str=="小王"){it_srw.setValue("小王王");}if(!QString::compare(str,"小明")){it_srw.remove();} } qDebug()<<"修改后的數(shù)據(jù):"; qDebug()<<vPeople;QMap
概述
QMap與QHash差別:
①Q(mào)Hash比QMap查找速度更快。
②QHash以任意順序存儲(chǔ),QMap以Key順序存儲(chǔ)數(shù)據(jù)。
③QHash的Key必須提供operator==()及一個(gè)全局的qHash(Key)函數(shù),而QMap的Key必須提供operator<()函數(shù)。
存儲(chǔ)一鍵多值數(shù)據(jù)時(shí)可使用QMultiMap<Key,T>容器或QMultiHash<Key,T>容器。
Java風(fēng)格迭代器
| 容器類(lèi) | 只讀迭代器 | 讀寫(xiě)迭代器 |
| QMap<Key,T>,QMultiMap<Key,T> | QMapIterator<Key,T> | QMutableMapIterator<Key,T> |
| QHash<Key,T>,QMultiHash<Key,T> | QHashIterator<Key,T> | QMutableHashIterator<Key,T> |
STL風(fēng)格迭代器
| 容器類(lèi) | 只讀迭代器 | 讀寫(xiě)迭代器 |
| QMap<Key,T>,QMultiMap<Key,T> | QMap<Key,T>::const_iterator | QMap<Key,T>::iterator |
| QHash<Key,T>,QMultiHash<Key,T> | QHash<Key,T>::const_iterator | QHash<Key,T>::iterator |
數(shù)據(jù)添加
QMap<QString,QString> infoMap; //數(shù)據(jù)添加 infoMap.insert("小明","168cm");//直接傳鍵值對(duì) infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; qDebug()<<infoMap;元素查找
QMap<QString,QString> infoMap; //數(shù)據(jù)添加 infoMap.insert("小明","168cm");//直接傳鍵值對(duì) infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; //通過(guò)key,找value qDebug()<<"小明的身高:"<<infoMap["小明"]; qDebug()<<"小張的身高:"<<infoMap.value("小張");//通過(guò)value,找key qDebug()<<"168cm的是:"<<infoMap.key("168cm");Java風(fēng)格迭代器
?只讀迭代器遍歷
QMap<QString,QString> infoMap; //數(shù)據(jù)添加 infoMap.insert("小明","168cm");//直接傳鍵值對(duì) infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; //只讀迭代器遍歷 QMapIterator<QString,QString> it_r(infoMap); for(it_r.toFront();it_r.hasNext();){it_r.next();qDebug()<<"Key:"<<it_r.key()<<" Value:"<<it_r.value(); }使用Java風(fēng)格迭代器對(duì)鍵值對(duì)類(lèi)型的數(shù)據(jù)遍歷時(shí),也可也按下面方式遍歷
迭代器不需要先調(diào)用next( ) 方法,直使用key( )方法獲取鍵,但是如果需要獲取值就需要先使用next( )方法
QMapIterator<QString,QString> it_r(infoMap); for(it_r.toFront();it_r.hasNext();){qDebug()<<"Key:"<<it_r.key()<<" Value:"<<it_r.next().value(); }讀寫(xiě)迭代器
?findNext( sss)函數(shù)會(huì)向后查找鍵值對(duì)的值是與sss匹配,如果匹配則返回true,并且迭代器向后移一位,如果不匹配返回false
QMap<QString,QString> infoMap; //數(shù)據(jù)添加 infoMap.insert("小明","168cm");//直接傳鍵值對(duì) infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; //讀寫(xiě)迭代器遍歷 QMutableMapIterator<QString,QString>it_mrw(infoMap); for(it_mrw.toFront();it_mrw.hasNext();){if(it_mrw.findNext("168cm")){it_mrw.setValue("170cm");}} qDebug()<<"修改數(shù)據(jù)后遍歷:"; for(it_mrw.toFront();it_mrw.hasNext();){qDebug()<<"Key:"<<it_mrw.key()<<" Value:"<<it_mrw.next().value(); }STL風(fēng)格迭代器
只讀迭代器遍歷
QMap<QString,QString> wMap; wMap.insert("春天","15℃"); wMap.insert("夏天","35℃"); wMap.insert("秋天","23℃"); wMap.insert("冬天","-3℃");QMap<QString,QString>::const_iterator i_r; //只讀迭代器遍歷 i_r=wMap.constBegin(); for(;i_r!=wMap.constEnd();++i_r){qDebug()<<"Key:"<<i_r.key()<<" Value:"<<i_r.value(); }讀寫(xiě)迭代器
QMap<QString,QString> wMap; wMap.insert("春天","15℃"); wMap.insert("夏天","35℃"); wMap.insert("秋天","23℃"); wMap.insert("冬天","-3℃");QMap<QString,QString>::iterator it_rw; it_rw = wMap.find("春天"); if(it_rw!=wMap.end()){it_rw.value()="16攝氏度"; } qDebug()<<"修改春天的數(shù)據(jù)后遍歷:"; it_rw=wMap.begin(); for(;it_rw!=wMap.end();it_rw++){qDebug()<<"Key:"<<it_rw.key()<<" Value:"<<it_rw.value();// qDebug()<<*it_rw; 解引用只能打印出值}QMultiMap
QMultiMap允許插入重復(fù)的鍵
插入數(shù)據(jù)
QMultiMap<QString,QString>wPeople; wPeople.insert("小明","168"); wPeople.insert("小王","167"); wPeople.insert("小張","172"); wPeople.insert("小明","170"); wPeople.insert("小王","176"); wPeople.insert("小王","172"); qDebug()<<wPeople;元素移除
QMultiMap<QString,QString>wPeople; wPeople.insert("小明","168"); wPeople.insert("小王","167"); wPeople.insert("小張","172"); wPeople.insert("小明","170"); wPeople.insert("小王","176"); wPeople.insert("小王","172"); qDebug()<<"移除前:"<<wPeople; wPeople.remove("小王","172"); qDebug()<<"移除后:"<<wPeople;查找鍵對(duì)應(yīng)的所有的值
QMultiMap<QString,QString>wPeople; wPeople.insert("小明","168"); wPeople.insert("小王","167"); wPeople.insert("小張","172"); wPeople.insert("小明","170"); wPeople.insert("小王","176"); wPeople.insert("小王","172"); qDebug()<<wPeople; qDebug()<<wPeople.values("小王");Java風(fēng)格的迭代
只讀迭代器遍歷
QMultiMap<QString,QString>wPeople; wPeople.insert("小明","168"); wPeople.insert("小王","167"); wPeople.insert("小張","172"); wPeople.insert("小明","170"); wPeople.insert("小王","176"); wPeople.insert("小王","172"); QMapIterator<QString,QString> i_r(wPeople); for(i_r.toFront();i_r.hasNext();){//鍵可以直接拿qDebug()<<i_r.key()<<":"//值需要先索引下一個(gè)位置<<i_r.next().value(); }QHash?
?數(shù)據(jù)插入
QHash<int,QString> moneyHash; moneyHash.insert(1,"一塊錢(qián)"); moneyHash.insert(2,"十塊錢(qián)"); moneyHash.insert(10,"三塊錢(qián)"); moneyHash[50]="五十塊錢(qián)"; //插入重復(fù)鍵需要使用insertMulti方法,否則就會(huì)被舊值會(huì)被新值覆蓋 moneyHash.insertMulti(50,"一百塊錢(qián)"); qDebug()<<moneyHash;Java風(fēng)格遍歷
QHash<int,QString> moneyHash; moneyHash.insert(1,"一塊錢(qián)"); moneyHash.insert(2,"十塊錢(qián)"); moneyHash.insert(10,"三塊錢(qián)"); moneyHash[50]="五十塊錢(qián)"; //插入重復(fù)鍵需要使用insertMulti方法,否則就會(huì)被舊值會(huì)被新值覆蓋 moneyHash.insertMulti(50,"一百塊錢(qián)"); QHashIterator<int,QString> it_mr(moneyHash); qDebug()<<"只讀正遍歷"; for(it_mr.toFront();it_mr.hasNext();){qDebug()<<it_mr.key()<<":"<<it_mr.next().value();}QVariant?
QVariant類(lèi)是Qt的共用體union數(shù)據(jù)類(lèi)型,不僅能保存很多Qt類(lèi)型的值,包括QColor,QBrush,QFont,QRect,QString及QSize等等,而且能存放Qt的容器類(lèi)型值。
可采用toT()將QVariant對(duì)象轉(zhuǎn)換稱(chēng)為T(mén)類(lèi)型并獲取其值。如toInt(),toFloat(),toString(),可用type方法獲取數(shù)據(jù)類(lèi)型,判斷數(shù)據(jù)是否可。對(duì)于GUI模塊中定義的數(shù)據(jù)類(lèi)型沒(méi)有相應(yīng)的轉(zhuǎn)換函數(shù),即沒(méi)有toColor(),沒(méi)有toImage()這樣的函數(shù)提供,可通過(guò)value()方法實(shí)現(xiàn)轉(zhuǎn)換,判斷兩種類(lèi)型是否可以轉(zhuǎn)換時(shí)可通過(guò)canConvert()方法的返回值判斷。
基本數(shù)據(jù)類(lèi)型
QVariant vNum(100); qDebug()<<vNum.toInt();QVariant vPI(3.14); qDebug()<<vPI.toFloat();QVariant vStr("Hello World"); qDebug()<<vStr.toString();QVariant vB(true); qDebug()<<vB.toBool();GUI數(shù)據(jù)類(lèi)型
?
QColor c =QColor(Qt::red); QVariant vC=c; qDebug()<<vC.type(); qDebug()<<vC.value<QColor>();canConvert( )與convert( )方法
?canConvert( )方法返回的是轉(zhuǎn)換能力,也就是是否有轉(zhuǎn)換成要求類(lèi)型的能力,例如canConvert(QVariant::int)返回的就是true,canConvert(QVariant::QColor)返回的就是false
convert( )是將調(diào)用類(lèi)型轉(zhuǎn)換成要求的類(lèi)型,如果不能轉(zhuǎn)換,例如“Hello"要轉(zhuǎn)int就會(huì)失敗,同時(shí)轉(zhuǎn)換失敗會(huì)將調(diào)用者清空數(shù)據(jù)。
QVariant vss="Hello"; //轉(zhuǎn)換//canConvert返回的是函數(shù)轉(zhuǎn)換的能力(例如是否有轉(zhuǎn)換成int類(lèi)型的能力), //但不一定能轉(zhuǎn)換成功,還要根據(jù)提供的數(shù)據(jù)qDebug()<<vss.canConvert(QVariant::Int); qDebug()<<"vss:"<<vss.toString(); //convert 如果提供的數(shù)據(jù)不合適,會(huì)轉(zhuǎn)換失敗,同時(shí)數(shù)據(jù)也會(huì)被清空 qDebug()<<vss.convert(QVariant::Int); qDebug()<<"vss:"<<vss.toString();?
?
?
總結(jié)
以上是生活随笔為你收集整理的QT—常用容器 QStringList,QVector,QMap,QHash,QVariant的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux应用程序开发之man手册汉化+
- 下一篇: 句子成分分析(C++)