QT—常用容器 QStringList,QVector,QMap,QHash,QVariant

  • Post author:
  • Post category:其他


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();



版权声明:本文为qq_54169998原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。