QT—常用容器 QStringList,QVector,QMap,QHash,QVariant
QMap与QHash差别:①QHash比QMap查找速度更快。②QHash以任意顺序存储,QMap以Key顺序存储数据。③QHash的Key必须提供operator==()及一个全局的qHash(Key)函数,而QMap的Key必须提供operator
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();
更多推荐
所有评论(0)