Qt容器详解
QString类
隐式共享:
隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。
隐式数据共享类当作为函数参数传递的时候,不仅安全而且效率很高,因为传递的时候只是传递了数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。
数据相同时,执行浅拷贝,仅复制指向数据块的指针,数据不同时则执行深拷贝。
隐式共享技术可以大大降低对内存的开销以及,CPU资源的消耗,很大程度提高应用程序的运行效率。
QString类保存了16位的Unicode值(宽字节),Unicode把所有语言都统一到一套编码里,Unicode提供UTF8、UTF16、UTF32编码方式。
UTF8以字节为单位对Unicode进行编码,对不同范围的字体使用不同长度的编码。对于0x000x7F之间的字符,UTF8编码与ASCII编码完全相同。
代码示例QStringsHello;Hello数据块引用计数为1QStrings1s;Hello数据块引用计数为2QStrings2s;Hello数据块引用计数为3其中一个进行球盖s2He;不在引用Hello这个数据块,Hello数据块引用1,He数据块引用计数为1QStrings3s;Hello数据块引用计数为3QStrings4s2;He数据块引用计数为2QStrings5s2;He数据块引用计数为2
初始化constchar初始化QStringshello;QStringstr(test);QChar数组初始化QCharcHi〔3〕{h,i};QStringstrHi(cHi,2);Z类对象初始化QStrings1s;
转换QString转数字QStringstrAge(18);intnAgestrAge。toInt();默认是10进制QStringstrRate(3。14);floatnRatestrRate。toFloat();QStringstrDouble(3。333);doublestrDstrDouble。toDouble();数字转QStringintyear2022;floatheight1。70f;QStringstrYear;strYearstrYear。number(year);QStringstrHeight;strHeightstrHeight。number(height);QStringstrTest;strTeststrTest。setNum(year);QString转QByteArrayQStringstrTomTom;QByteArraytomArraystrTom。toUtf8();constcharcTomtomArray。data();QString转QDataTimeQStringstrTime1949100110:00:00;QDateTimedtTimeQDateTime::fromString(strTime,yyyyMMddhh:mm:ss);QDateTime转QStringQDateTimedtCurrentQDateTime::currentDateTime();QStringstrCurrentdtCurrent。toString(yyyyMMddhh:mm:ss);
常用方法QString的拼接QStrings对不起;s我是警察。;s。append(Sorry。);结尾添加QString格式化QStrings0;s0。sprintf(sds,我,19,岁了。);QStrings1;s1QString(123)。arg(我)。arg(19)。arg(岁了。);以索引方式访问QCharqc1s1。at(1);插入字符QStrings2我岁了。;QStrings319;s2。insert(1,s3。toUtf8());在字符串起始位置插入s2。prepend(今年);指定位置进行替换s2。replace(0,2,去年);去除字符串两端的空格,中间的空格变为一个空格s2。trimmed();查询字符QStrings4哔哩哔哩关注快乐的威猛先生;查询是否以xx开头,BOOLqDebug()s4。startsWith(哔哩哔哩);QStrings5tom;qDebug()s5。startsWith(tom,Qt::CaseSensitive);大小写敏感查询是否以xx结尾qDebug()s5。endsWith(威猛先生);同样可以表明大小写是否敏感是否包含qDebug()s5。contains(o);同样可以表明大小写是否敏感比较qDebug()QString::compare(Tom,tom,Qt::CaseInsensitive);判断字符串是否相等,大小写是否敏感分割字符串QStringstrTime2022117;QStringListtimeListstrTime。split();foreach(QStringss,timeList){循环读取容器中的元素,用一个变量来接收读取到的数据qDebug()ss;}截取字符串QStringsFriendsEnvyuskenyS;qDebug()sFriends。mid(1,1);判断NULL字符串isNull(),采用默认构造函数,或者用constcharxx来对QString进行构造判断空字符传isEmpty()QStringList
QString类型的链表
常用操作。
【领QT开发教程学习资料,点击Qt开发(视频教程文档代码项目实战)莬费领取,先码住不迷路】QStringListweekList;weekList星期一星期二星期三星期四星期五星期六;weekList。append(星期天);尾插qDebug()weekList;for遍历链表for(inti0;iweekList。size();i){qDebug()weekList。at(i);}foreach遍历链表foreach(QStringss,weekList){qDebug()ss;}STL风格迭代器QStringList::iteratoritweekList。begin();for(;it!weekList。end();it){qDebug()it;}JAVA风格迭代QListIteratorQStringitr(weekList);while(itr。hasNext()){qDebug()itr。next();java风格的迭代器初识位置在第一个元素的前一个位置}查看链表中是否包含某个元素qDebug()weekList。contains(星期八);插入元素weekList。insert(0,星期零);weekList。append(星期八);删除元素weekList。removeFirst();weekList。removeLast();weekList。removeOne(星期一);weekList。removeAt(0);weekList。clear();
QList
QListT是最常用的容器类。QList以列表形态存储并管理数据,并能进行基于快速索引的访问,也可以进行快速的数据删除操作。继承自QList类的子类有QItemSelection、QQueue、QStringList、QTestEventList。
可用运算符、append()、prepend()进行添加元素,insert()进行插入。QListT维护了一个指针数组,数组元素指向每一个链表项,因此QListT提供了基于下标的快速访问。
Java风格迭代器迭代点位置:第一个列表项前、两个列表项中间、最后一个列表项之后。STL风格迭代器迭代点位置:直接指向列表项。
QString中可以通过〔〕来访问元素。因为里面放的是指针,通过指针访问元素。
相关操作示例QListintlist;添加与元素list12345;list。append(0);list。prepend(6);list。insert(0,99);查找元素list。at(2);list〔2〕;查看是否包含list。contains(8);修改元素list。replace(1,66);list〔2〕77;删除元素list。removeFirst();list。removeLast();删除指定位置元素list。removeAt(2);指定元素删除list。removeOne(66);清空链表list。clear();
迭代器
JAVA风格迭代器JAVA风格迭代器QListintmontList;QMutableListIteratorintitmrw(montList);for(inti0;i12;i){itmrw。insert(i);}反遍历将迭代器移到结尾,判断前面是否有数据for(itmrw。toBack();itmrw。hasPrevious();){qDebug()itmrw。previous();}正遍历for(itmrw。toFront();itmrw。hasNext();){qDebug()itmrw。next();}删除、修改for(itmrw。toFront();itmrw。hasNext();){intmonthitmrw。next();if(month0){itmrw。remove();}if(month11){itmrw。setValue(12);}}qDebug()montList;只读迭代器QListIteratorintitmr(montList);正遍历for(itmr。toFront();itmr。hasNext();){qDebug()itmr。next();}反遍历for(itmr。toBack();itmr。hasPrevious();){qDebug()itmr。previous();}
STL风格迭代器STL风格迭代器QListintnumList;numList10111213;读写迭代器QListint::iteratoritnumRW;for(itnumRWnumList。begin();itnumRW!numList。end();itnumRW){itnumRWitnumRW10;qDebug()itnumRW;}qDebug();只读迭代器QListint::constiteratoritnumR;constEnd方法返回的迭代器指向最后一个元素之后,是虚拟的。for(itnumRnumList。constBegin();itnumR!numList。constEnd();itnumR){qDebug()itnumR;}qDebug();QLinkedList
更加高效,大量数据情况下运行速度更快。是一个更加纯粹的链表。
不支持下标访问,不用维护那个指针数组。QLinkedListQStringweekList;for(intj1;j8;j){weekListQString(12)。arg(星期)。arg(j);}JAVA风格只读迭代器QLinkedListIteratorQStringitwr(weekList);for(itwr。toFront();itwr。hasNext();){qDebug()itwr。next();}Java风格读写迭代器QMutableLinkedListIteratorQStringitwrw(weekList);for(itwrw。toFront();itwrw。hasNext();){QStringdayitwrw。next();if(day星期3){itwrw。setValue(星期三);}if(day星期5){itwrw。setValue(星期五);}if(day星期6){itwrw。insert(星期六6);插入到当前位置的后面}}for(itwrw。toFront();itwrw。hasNext();){qDebug()itwrw。next();}QLinkedList不能支持下标访问QVector
QVector在相邻的内存中存储给定数据类型T的一组数据。在QVector前部或中间位置插入操作速度都很慢,因为会导致内存中大量数据的移动。访问数据可使用下标,也可以使用迭代器。继承自QVector类的子类有QPolygon、QPolygonF、QStack。QVectorQStringvStarts;添加元素vStarts星期1星期2星期3;vStarts。append(星期4);vStarts。prepend(星期5);vStarts。insert(0,星期6);修改元素vStarts。replace(0,星期六);删除元素vStarts。remove(0);vStarts。removeFirst();vStarts。removeAll(星期日);访问元素vStarts〔2〕;vStarts。at(2);vStarts。contains(星期日);JAVA风格只读迭代QVectorIteratorQStringitsr(vStarts);for(itsr。toFront();itsr。hasNext();){qDebug()itsr。next();}JAVA风格读写迭代QMutableVectorIteratorQStringitsrw(vStarts);for(itsrw。toFront();itsrw。hasNext();){QStringsitsrw。next();if(!QString::compare(s,星期1)){itsrw。setValue(星期一);}}qDebug()vStarts;QMap
QMap与QHash差别:
QHash比QMap查找速度更快。
QHash以任意顺序存储,QMap以key顺序存储数据。
QHash的key必须提供operator()及一个全局的qHash(key)函数,而QMap必须提供operator()函数。
存储一键多值数据时可使用QMultiMapkey,T容器或QMultiHashkey,T容器
默认从小到大排序。
QMapQString,QStringinfoMap;infoMap。insert(哈哈哈哈,鸡汤来喽);infoMap。insert(芜湖,起飞);infoMap〔哔哩哔哩〕快乐的威猛先生;infoMap〔CSDN〕半生瓜blog;通过key查找valueqDebug()infoMap〔哔哩哔哩〕;通过value找keyqDebug()infoMap。key(快乐的威猛先生);JAVA风格只读迭代器QMapIteratorQString,QStringitr(infoMap);for(itr。toFront();itr。hasNext();){itr。next();qDebug()itr。key():itr。value();}JAVA风格读写迭代器QMutableMapIteratorQString,QStringitrw(infoMap);for(itrw。toFront();itrw。hasNext();){itrw。next();if(itrw。key()哔哩哔哩){itrw。setValue(关注快乐的威猛先生);}}STL风格只读迭代器QMapQString,QString::constiteratorir;irinfoMap。constBegin();for(;ir!infoMap。constEnd();ir){qDebug()ir。key():ir。value();}STL风格读写迭代器QMapQString,QString::iteratorirw;for(irwinfoMap。begin();irw!infoMap。end();irw){if(irw。key()哔哩哔哩){irw。value()快关注威猛先生;}}irwinfoMap。find(哔哩哔哩);irw。value()bilibili;for(irwinfoMap。begin();irw!infoMap。end();irw){qDebug()irw;value}一个键对应多个值QMultiMapQString,QStringwMap1;一个key对应多个valuewMap1。insert(spring1,5C);wMap1。insert(spring2,15C);wMap1。insert(spring2,16C);wMap1。insert(spring2,17C);wMap1。insert(spring3,25C);wMap1。insert(spring4,35C);wMap1。insert(spring4,36C);wMap1。insert(spring4,37C);指定元素删除wMap1。remove(spring1,5C);查询指定valuewMap1。values(spring2);JAVA风格只读迭代QMapIteratorQString,QStringitr1(wMap1);for(itr1。toFront();itr1。hasNext();){qDebug()itr1。key():itr1。next()。value();这个迭代器看起来比较变扭,先拿key,然后通过下一个迭代点拿value}qDebug()wMap1;QHash
无序。QHash类QHashint,QStringmoneyHash;moneyHash。insert(1,一块钱);moneyHash。insert(10,十块钱);moneyHash。insert(20,二十块钱);moneyHash。insert(50,五十块钱);moneyHash〔50〕50;moneyHash。insertMulti(50,50块钱);插入多个valueqDebug()moneyHash;JAVA风格只读迭代器QHashIteratorint,QStringitmr(moneyHash);for(itmr。toFront();itmr。hasNext();){qDebug()itmr。key()itmr。next()。value();}JAVA风格读写迭代器QMutableHashIteratorint,QStringitmrw(moneyHash);修改数据if(itmrw。findNext(十块钱)){itmrw。setValue(10元);}for(itmrw。toFront();itmrw。hasNext();){qDebug()itmrw。key():itmrw。next()。value();}qDebug()moneyHash;QVariant类
QVariant类能保存很多Qt类型的值,包括QColor,QBrush,QFont,QRect,QString及QSize等等,而且能存放Qt的容器类型值。
可采用toT()将QVariant对象转换为T类型数据并获取其值。如toInt(),toFloat(),toString(),可用type方法获取数据类型。对于GUI模块中定义的数据类型没有相应的转换函数,即没有toColor(),没有toImage()这样的函数提供,可通过value()方法实现转换,判断两种类型是否可以转换可通过用type方法获取数据类型,判断方法的返回值判断。QVariantvNum(100);qDebug()vNum。toInt();QVariantvPi(3。1415f);qDebug()vPi。toFloat();QVariantvStr(Hello);qDebug()vStr。toString();QVariantvb(true);qDebug()vb。toBool();QColorcQColor(Qt::red);QVariantVCc;qDebug()VC。type();qDebug()VC。valueQColor();QVariantvssvStr;qDebug()vss。canConvert(QVariant::Int);返回数据类型转换能力,QVariant的转换能力qDebug()vss。convert(QVariant::Int);false,转换失败,数据清空转换成功的条件:有转换能力,且数据类型匹配。
有没有一款车身宽大,价格1万元右的踏板摩托车?如果想选一款车身比较宽大的摩托车,其实是很多的,但是价位在一万元左右,那就有点难了,你自己去看了,觉本田的裂行感觉踏板位置太窄了,放个大点的包都放不下,绝对不行,那么大部……
济南周边哪家民营加油站便宜,靠谱?在济南市区还真有一家民营加油站,比两桶油的加油站便宜的很。而且油品稳定,靠谱。我说的这家民营加油站,在济南市有六七个加油站,还有几个加气站。对于私家车来说,他的油品价格便……
维生素缺乏症一览表,看看自己缺什么,不妨了解一下,建议收藏维持机体正常功能所必需,需要量很少,不供给能量,但人体不可缺少,不能在体内合成或合成量太少,需要从食物中摄取,目前发现的维生素大约有14种,可分为脂溶性维生素和水溶性维生素。……
开路虎的和开奔驰大G的人,在性格和职业上有什么不同?先感慨下心得,买车时候在揽胜和大G间徘徊了很久,最终还是选择了大G,原因如下:1,家里完全不缺车,家人还有自己车都是一线豪华舒适SUV,揽胜驾乘跟GLE好像,功能大同小异……
金九银十是汽车的销售旺季,为何今年会出现一车难求的局面?谢邀。金九银十确实是传统的购车旺季,一方面进入下半年,很多人会有旧车置换的需求,以便在年底和传统农历春节前实现新车提车和上牌,今年金九银十的市场需求也确实存在,只是题主问到的一……
汽车有必要装方向盘套吗?〔汽车之家用车养车〕很多开车的朋友都遇到过相同的问题,冬天的早晨进入到车里(不包括那些拥有15恒温地库的人们),在暖风没来之前可以说是一种煎熬。这也就是为何衍生出种类众多冬季车……
衬衫的复古感都很强,我一直很喜欢法兰绒,亲肤不易皱不起球程序员格子衬衫穿搭复古风格!这件衬衫当时太喜欢啦!蓝色清爽更适合春天。衬衫的复古感都很强,隐约记得我爸年轻时候也有一件。分析一下复古感的来源:颜色:明度和饱和度都很……
豪爵本田雅马哈,哪个牌子的好?新车这几个牌子都差不多,骑2万公里以后本田表现比铃木和雅马哈要好,第一本田发电机不容易出现故障,第二就是坏了,容易维修,原来这几个品牌摩托车我都卖过,所以比较了解,本田,铃木,……
一个人自驾去西藏,路上安全吗?一个人自驾西藏,这事我干过1。5次。说西藏绝对安全,或者说西藏危机重重,都是虾扯蛋。安不安全,要首先了解西藏有哪些危险。了解了下面这些,而且能做到,肯定就安全了。1……
高速公路上如何避免追尾和被追尾?高速公路上发生汽车追尾事故,有两种情况,即,自己主动追尾别人或被别人追尾。高速公路上由于车速快,车流量大等特点,一旦发生追尾往往会引发多车连续追尾,酿成严重的交通事故。……
韩国首个月球轨道探测器发射,将探测登月候选地韩国计划在月球表面或小行星上成功着陆并安全返回,该计划的第一步是2022年发射月球轨道探测器,此外到2030年实现首次登月。韩国首个月球轨道探测器Danuri号发射升空,……
想入手宝马5系,有何建议?大家好我是淡墨,每天分享有趣的汽车问答内容,欢迎各位朋友关注。这一代的宝马5系在口碑方面的确是一款不错的车型,也是很多人在这个级别会考虑之一,而对于消费者来说,我个人可以……