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

news2024/11/26 7:26:24

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

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题复盘笔记—一文搞懂动态规划之123. 买卖股票的最佳时机 III问题(动态规划系列第二十二篇)

今日主要总结一下动态规划的一道题目&#xff0c;123. 买卖股票的最佳时机 III 题目&#xff1a;123. 买卖股票的最佳时机 III Leetcode题目地址 题目描述&#xff1a; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能…

小程序地图插入图标后 怎么实现点击图标弹出窗口

1问题描述本次博客的要解决的问题是&#xff1a;小程序地图插入图标后 怎么实现点击图标弹出窗口如图&#xff1a;2算法描述点击标记点获取数据想要在地图等页面上显示弹窗&#xff0c;是使用的是marke的方法&#xff0c;点击标记点获取数据先在wxml里写好布局文件<view cl…

可强占RCU

可强占RCU前言前言 RCU机制属于无锁编程的一种&#xff0c;在访问读端临界区时不需要加锁&#xff0c;故不存在上面提到的锁的问题&#xff0c;所以拥有极好的扩展性&#xff0c;且可以多个读者同时存在。那为什么不用RCU锁取代其他锁呢&#xff1f;前面说到读端不用加锁&…

光纤耦合装置的公差分析

摘要 在现代光学中&#xff0c;光纤存在于各种光学系统中&#xff0c;能够将多少光耦合到光纤中一直是人们关注的问题。耦合效率对系统的对准十分敏感&#xff0c;特别是对于芯径相对较小的单模光纤。在本例中&#xff0c;我们选择了一个设计良好的光纤耦合透镜&#xff0c;并根…

ARM异常处理(异常源的分类、异常的响应流程)

目录 一、异常的概念 1、什么是异常&#xff1f; 2、处理异常时&#xff0c;处理器要考虑哪些问题&#xff1f; 二、ARM异常源 1、异常源的分类 2、异常模式 三、ARM异常响应 1、CPSR寄存器内容备份&#xff08;自动执行&#xff09; 2、修改CPSR的值&#xff08;自动…

广告倒排服务极致优化

作者 | XY 导读 漏斗优化是检索系统不变的话题&#xff0c;过去一年来&#xff0c;广告漏斗优化一改往日做“加法”&#xff0c;而通过简化漏斗&#xff0c;提升全系统一致性。如百度这样庞大的广告库规模、高流量规模以及复杂的业务规则&#xff0c;要做到极简的漏斗层次&…

206367-33-1,抗菌肽pBD-1

pBD-1 是一种来源于猪组织的内源性组成型表达的抗菌肽 (AMP)&#xff0c;尤其在猪黏膜上皮部位表达。pBD-1 具有抗菌作用&#xff0c;并且有助于猪黏膜和系统宿主防御。pBD-1 is an endogenous and constitutively expressed antimicrobial peptide (AMP) from porcine tissues…

rocketmq源码-consumer拉取消息(push模式)

前言 在前面consumer启动的博客中&#xff0c;有说过&#xff0c;在启动过程中&#xff0c;有两个比较重要的逻辑&#xff0c;分别是负载均衡和拉取消息的service&#xff0c;这篇博客&#xff0c;主要记录拉取消息的service&#xff0c;因为前面的demo和这篇笔记中的demo&…

电磁场知识整理------2022/12/14

电磁场知识整理1、数学基础麦克斯韦方程2、麦克斯韦方程组的近似情况2.1 恒定电场2.2 恒定电流场2.3 恒定磁场2.4 动态电磁场2.5 时谐电磁场3、电磁辐射与电磁波写在最后学习资源&#xff1a;慕课上浙大的工程电磁场与波。 工程电磁场与波 1、数学基础 正交坐标系&#xff1a;…

Android 线上卡顿监控

文章目录1. 卡顿与ANR的关系2. 卡顿原理3. 卡顿监控3.1 WatchDog3.2 Looper Printer3.2.1 监控TouchEvent卡顿3.2.2 监控IdleHandler卡顿3.2.3 监控SyncBarrier泄漏4. 小结平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而…

leetcode 375. 猜数字大小 II-【python3详细图解】递归+记忆化搜索与动态规划

题目 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字&#xff0c;就会 赢得游戏 。如果你猜错了&#xff0c;那么我会告诉你&#xff0c;我选的数字比你的 更大或者更小 &#xff0c…

二十、JavaScript——逻辑非

! 逻辑非- &#xff01;可以对一个值进行非运算 - 它可以对一个布尔值进行取反操作 true 变成 false false 变成 true - 如果对一个非布尔值进行取反&#xff0c;它会将其先转换为布尔值&#xff0c;再进行取反操作 可以利用这个特点将其他类型转换为布尔值 <script>/*! …

Hybrid模式下,如何实现热更新?

做过开发的小伙伴应该对“热更新”不陌生吧&#xff01;热更新就是指在游戏或软件更新的时候&#xff0c;不用再重新下载安装包进行安装&#xff0c;而是在启动应用程序的时候&#xff0c;在内部进行资源或代码的更新。那么如今&#xff0c;市场为什么越来越多地选择热更新技术…

数据结构——图最全总结(期末复习必备)

目录 图 定义&#xff1a; 基本术语&#xff1a; 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重表 图的遍历 深度优先搜索(Depth First Search,DFS) 广度优先搜索(Breadth First Search,BFS) 图的应用 最小生成树 普利姆算法 克鲁斯卡尔算法 最短路径 单源最短…

优蓝冲刺港股:上半年期内亏损过亿 主打蓝领人才服务

雷递网 雷建平 12月14日优蓝国际控股股份有限公司&#xff08;简称&#xff1a;“优蓝”&#xff09;日前递交招股书&#xff0c;准备在香港上市。上半年期内亏损1.18亿优蓝是一家蓝领终身服务平台&#xff0c;旨在成为蓝领人才的首选终身服务平台。截至最后实际可行日期&#…

[附源码]Nodejs计算机毕业设计基于博客系统的UI手机界面展示Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

vue3插槽(匿名插槽-具名插槽-插槽作用域-动态插槽)

文章目录容器布局匿名插槽具名插槽作用域插槽动态插槽容器布局 &#x1f468;&#x1f3fb; parent.vue <script setup lang"ts"> import { ref, useAttrs, defineProps } from "vue"; import children from ./children.vue</script><tem…

界面控件DevExpress WinForm——HTML-CSS感知控件介绍

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

疫情防控|Springboot+小程序+校园疫情防控系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

【刷题笔记】之牛客面试必刷TOP101(二分查找-I + 二维数组中的查找 + 寻找峰值 + 数组中的逆序对 + 旋转数组的最小数字 + 比较版本号)

目录 1. 二分查找-I 2. 二维数组中的查找 3. 寻找峰值 4. 数组中的逆序对 5. 旋转数组的最小数字 6. 比较版本号 1. 二分查找-I 题目链接&#xff1a;二分查找-I_牛客题霸_牛客网 (nowcoder.com) 题目要求&#xff1a; 上代码 import java.util.*;public class Solut…