QT—常用容器 QStringList,QVector,QMap,QHash,QVariant
QStringList
元素添加
可以直接添加元素,也可也使用append( )方法在末尾追加元素
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; weekList.append("星期四"); qDebug()<<weekList;元素遍歷?
?for循環遍歷
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風格遍歷
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; //字符串類型的鏈表迭代器 QListIterator<QString> itr(weekList); while(itr.hasNext()){qDebug()<<itr.next(); }鏈表查找
使用contains( )方法可以查找數組中是否包含該字符串
QStringList weekList<<"星期一"<<"星期二"<<"星期三"; qDebug()<<"鏈表中有星期二:"<<weekList.contains("星期二"); qDebug()<<"鏈表中有星期五:"<<weekList.contains("星期五");鏈表插入元素
使用insert( )方法可以向鏈表中插入元素,insert( )方法第一個參數表示插入的位置,第二個參數表示要插入的數據
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在相鄰的內存中存儲給定數據類型T的一組數據。在QVector前部或中間位置插入操作速度都很慢,因會導致內存中大量的數據移動。訪問數據可使用下標,也可使用迭代器。繼承自QVector類的子類有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,"無名氏");//修改元素 vPeople.removeLast();//刪除元素 vPeople.remove(1); //刪除指定位置元素 vPeople.removeAll("小明");//刪除所有的指定元素 qDebug()<<"修改后:"<<vPeople;下標索引和判斷鏈表是否包含某個元素
QVector<QString> vPeople; vPeople<<"小明"<<"小王"<<"小李"<<"小孫"<<"小張"; qDebug()<<"第三個People:"<<vPeople[2]; qDebug()<<"是否有小明:"<<vPeople.contains("小明");Java風格的遍歷和讀寫?
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()<<"修改后的數據:"; qDebug()<<vPeople;QMap
概述
QMap與QHash差別:
①QHash比QMap查找速度更快。
②QHash以任意順序存儲,QMap以Key順序存儲數據。
③QHash的Key必須提供operator==()及一個全局的qHash(Key)函數,而QMap的Key必須提供operator<()函數。
存儲一鍵多值數據時可使用QMultiMap<Key,T>容器或QMultiHash<Key,T>容器。
Java風格迭代器
| 容器類 | 只讀迭代器 | 讀寫迭代器 |
| 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風格迭代器
| 容器類 | 只讀迭代器 | 讀寫迭代器 |
| 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 |
數據添加
QMap<QString,QString> infoMap; //數據添加 infoMap.insert("小明","168cm");//直接傳鍵值對 infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; qDebug()<<infoMap;元素查找
QMap<QString,QString> infoMap; //數據添加 infoMap.insert("小明","168cm");//直接傳鍵值對 infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; //通過key,找value qDebug()<<"小明的身高:"<<infoMap["小明"]; qDebug()<<"小張的身高:"<<infoMap.value("小張");//通過value,找key qDebug()<<"168cm的是:"<<infoMap.key("168cm");Java風格迭代器
?只讀迭代器遍歷
QMap<QString,QString> infoMap; //數據添加 infoMap.insert("小明","168cm");//直接傳鍵值對 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風格迭代器對鍵值對類型的數據遍歷時,也可也按下面方式遍歷
迭代器不需要先調用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(); }讀寫迭代器
?findNext( sss)函數會向后查找鍵值對的值是與sss匹配,如果匹配則返回true,并且迭代器向后移一位,如果不匹配返回false
QMap<QString,QString> infoMap; //數據添加 infoMap.insert("小明","168cm");//直接傳鍵值對 infoMap.insert("小張","170cm"); infoMap["小麗"]="168cm"; //讀寫迭代器遍歷 QMutableMapIterator<QString,QString>it_mrw(infoMap); for(it_mrw.toFront();it_mrw.hasNext();){if(it_mrw.findNext("168cm")){it_mrw.setValue("170cm");}} qDebug()<<"修改數據后遍歷:"; for(it_mrw.toFront();it_mrw.hasNext();){qDebug()<<"Key:"<<it_mrw.key()<<" Value:"<<it_mrw.next().value(); }STL風格迭代器
只讀迭代器遍歷
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(); }讀寫迭代器
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()<<"修改春天的數據后遍歷:"; 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允許插入重復的鍵
插入數據
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;查找鍵對應的所有的值
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風格的迭代
只讀迭代器遍歷
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()<<":"//值需要先索引下一個位置<<i_r.next().value(); }QHash?
?數據插入
QHash<int,QString> moneyHash; moneyHash.insert(1,"一塊錢"); moneyHash.insert(2,"十塊錢"); moneyHash.insert(10,"三塊錢"); moneyHash[50]="五十塊錢"; //插入重復鍵需要使用insertMulti方法,否則就會被舊值會被新值覆蓋 moneyHash.insertMulti(50,"一百塊錢"); qDebug()<<moneyHash;Java風格遍歷
QHash<int,QString> moneyHash; moneyHash.insert(1,"一塊錢"); moneyHash.insert(2,"十塊錢"); moneyHash.insert(10,"三塊錢"); moneyHash[50]="五十塊錢"; //插入重復鍵需要使用insertMulti方法,否則就會被舊值會被新值覆蓋 moneyHash.insertMulti(50,"一百塊錢"); QHashIterator<int,QString> it_mr(moneyHash); qDebug()<<"只讀正遍歷"; for(it_mr.toFront();it_mr.hasNext();){qDebug()<<it_mr.key()<<":"<<it_mr.next().value();}QVariant?
QVariant類是Qt的共用體union數據類型,不僅能保存很多Qt類型的值,包括QColor,QBrush,QFont,QRect,QString及QSize等等,而且能存放Qt的容器類型值。
可采用toT()將QVariant對象轉換稱為T類型并獲取其值。如toInt(),toFloat(),toString(),可用type方法獲取數據類型,判斷數據是否可。對于GUI模塊中定義的數據類型沒有相應的轉換函數,即沒有toColor(),沒有toImage()這樣的函數提供,可通過value()方法實現轉換,判斷兩種類型是否可以轉換時可通過canConvert()方法的返回值判斷。
基本數據類型
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數據類型
?
QColor c =QColor(Qt::red); QVariant vC=c; qDebug()<<vC.type(); qDebug()<<vC.value<QColor>();canConvert( )與convert( )方法
?canConvert( )方法返回的是轉換能力,也就是是否有轉換成要求類型的能力,例如canConvert(QVariant::int)返回的就是true,canConvert(QVariant::QColor)返回的就是false
convert( )是將調用類型轉換成要求的類型,如果不能轉換,例如“Hello"要轉int就會失敗,同時轉換失敗會將調用者清空數據。
QVariant vss="Hello"; //轉換//canConvert返回的是函數轉換的能力(例如是否有轉換成int類型的能力), //但不一定能轉換成功,還要根據提供的數據qDebug()<<vss.canConvert(QVariant::Int); qDebug()<<"vss:"<<vss.toString(); //convert 如果提供的數據不合適,會轉換失敗,同時數據也會被清空 qDebug()<<vss.convert(QVariant::Int); qDebug()<<"vss:"<<vss.toString();?
?
?
總結
以上是生活随笔為你收集整理的QT—常用容器 QStringList,QVector,QMap,QHash,QVariant的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux应用程序开发之man手册汉化+
- 下一篇: 卡片 -【2020牛客NOIP-普及组(