Qt中 QMap 类、QHash 类、QVector 类详解

news2024/11/19 1:23:08

目录

一、QMap 类

1.插入数据信息

2.删除数据信息

3.迭代器

4.STL类型迭代

5.key键/T键查找

6.修改键值

7. 一个键对应多个值 直接使用QMultiMap类来实例化一个QMap对象

二、QHash 类

三、QVector类


一、QMap 类

QMap<Key,T>提供一个从类型为 Key 的键到类型为T的值的映射。通常QMap 存储的数据形式是一个键对应一个值,并且按照键 Key 的次序存储数据。为了能够支持一键多值的情况,QMap 提供 QMap<Key,T>::insertMulti()和QMap<Key,T>::values()函数。QMultiMap 类来实例化一个 QMap 对象

应用示例:

创建QMap实例,第一个参数为QString类型的值,第二个参数为int类型的值

1.插入数据信息
    // 创建QMap实例,第一个参数为QString类型的值,第二个参数为int类型的值
    QMap<QString,int> qmap;

    // 插入数据信息,两种方式
    qmap["zgl"] = 666;
    qmap["ljx"] = 520;

    qmap.insert("ljg",666);
    qmap.insert("ljc",666);

    qDebug()<<qmap;
2.删除数据信息
    // 删除数据信息key键
    qmap.remove("zgl");
    qDebug()<<qmap<<endl;
3.迭代器
    // 遍历 QMap 类的实例:数据信息
    // 1.迭代器
    QMapIterator<QString,int> itr(qmap);
    while(itr.hasNext()){
        itr.next();
        qDebug()<<itr.key()<<":"<<itr.value();
    }
4.STL类型迭代
    // 2.STL类型的迭代
    qDebug()<<endl;
    QMap<QString,int>::const_iterator stritr = qmap.constBegin();
    while(stritr != qmap.constEnd()){
        qDebug()<<stritr.key()<<":"<<stritr.value();
        stritr++;
    }
5.key键/T键查找
    // 用key键/T键查找
    qDebug()<<endl;
    qDebug()<<"Key-->T"<<qmap.value("ljg");
    qDebug()<<"T-->Key"<<qmap.key(520)<<endl;
6.修改键值
    // 修改键值
    // 一个键对应一个值,再次调用insert()函数将覆盖之前的值
    qmap.insert("ljg",111);
    qDebug()<<qmap.value("ljg");
7. 一个键对应多个值 直接使用QMultiMap类来实例化一个QMap对象
    // 一个键对应多个值
    // 直接使用QMultiMap类来实例化一个QMap对象
    qDebug()<<endl;
    QMultiMap<QString,QString> mulmap;
    mulmap.insert("student","name");
    mulmap.insert("student","sex");
    mulmap.insert("student","age");
    qDebug()<<mulmap;

二、QHash 类

QHash<Key,T>具有与 QMap 几乎完全相同的APl。QHash 维护着一张哈希表 (Hash Table) ,哈希表的大小与 QHash 的数据项的数目相适应。

QHash 以任意的顺序组织它的数据。当存储数据的顺序无关紧要时,建议使用 QHash 作为存放数据的容器。

案例分析:

#include <QCoreApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // QHash 类
    QHash<QString,int> qhash;

    qhash["key 1"] = 3;
    qhash["key 1"] = 8;
    qhash["key 4"] = 4;
    qhash["key 3"] = 2;
    qhash.insert("key 3",30);

    QList<QString> list = qhash.keys();
    for(int i=0;i<list.length();i++){
        qDebug()<<list[i]<<","<<qhash.value(list[i]);
    }

    // QHash 内部的迭代器 QHashIterator 类
    qDebug()<<endl;
    QHash<QString,int> hash;
    hash["key 1"] = 11;
    hash["key 2"] = 22;
    hash["key 3"] = 33;
    hash["key 4"] = 44;
    hash.insert("key 3",100);

    QHash<QString,int>::const_iterator itr;
    for(itr = hash.begin();itr != hash.end();itr++){
        qDebug()<<itr.key()<<"-->"<<itr.value();
    }

    return a.exec();
}

编译执行结果:每次排序都不同

QMap 与 QHash 区别:

  • QHash 与 QMap 的功能差不多,但 QHash 的查找速度更快
  • QMap 是按照键的顺序存储数据,而 QHash 是任意顺序存储的
  • QMap 的键必须提供"<”运算符,而 QHash 的键必须提供“=="运算符和一个名为 qHash()的全局散列函数

三、QVector类

QVector<T>在相邻的内存当中存储给定数据类型T的一组数值。在一个QVector 的前部或者中间位置进行插入操作的速度是很慢的,这是因为这样的操作将导致内存中的大量数据被移动,这是由 QVector 存储数据的方式决定的
案例分析:

#include <QCoreApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // Qvector类
    // Qvector<T>是Qt的一个容器类
    QVector<int> qvr;

    // 第一种赋值方式
    qvr<<10;
    qvr<<20;
    qvr<<30;
    qvr<<40;
    // 第二种赋值方式
    qvr.append(50);
    qvr.append(60);
    qvr.append(70);

    qDebug()<<qvr<<endl;

    // 求出Qvector 类容器的实例化:元素个数
    qDebug()<<"qvr count = "<<qvr.count()<<endl;

    // 遍历所有元素
    for(int i=0;i<qvr.count();i++){
        qDebug()<<qvr[i];
    }

    // 删除qvr容器里面的元素
    qDebug()<<endl;
    qvr.remove(0);
    for(int i=0;i<qvr.count();i++){
        qDebug()<<qvr[i];
    }

    // 从第二个元素开始,删除后面三个元素
    qvr.remove(2,3);
    qDebug()<<endl;
    for(int i=0;i<qvr.count();i++){
        qDebug()<<qvr[i];
    }

    // 判断容器中是否包含某个元素
    qDebug()<<endl;
    qDebug()<<"result = "<<qvr.contains(70);// 返回ture
    qDebug()<<"result = "<<qvr.contains(666);// 返回false

    return a.exec();
}

编译执行结果:

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

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

相关文章

制作电商页面(Html)

任务 制作一个电商页面&#xff0c;要求所卖物品清晰&#xff0c;页面色调清晰&#xff0c;要有主页和详情页。 网站所买物品&#xff1a;书籍 色调&#xff1a;#FF2400 橙红色 代码 主页HTML代码&#xff1a; <html><head><meta charset"utf-8"…

力扣 -- 647. 回文子串

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int countSubstrings(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));//无需初始化int ret0;//一定要从下往上填写每一行for(int in-1;i>0;i--){//每一行的i…

Selenium基础

最近在学习爬虫的有关知识&#xff0c;发现一个很有意思的工具Selenium&#xff0c;所以打算花点时间看Selenium提供的手册来学习&#xff0c;为了防止以后忘记和方便复习&#xff0c;打算记录一下我的学习过程&#xff0c;我使用的Selenium版本是4.8.2。 目录 Selenium概述 网…

C++设计模式-享元(Flyweight)

目录 C设计模式-享元&#xff08;Flyweight&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-享元&#xff08;Flyweight&#xff09; 一、意图 运用共享技术有效地支持大量细粒度的对象。 二、适用性 一个应用程序使用了大量的对象。完全由…

【RabbitMQ】初识消息队列 MQ,基于 Docker 部署 RabbitMQ,探索 RabbitMQ 基本使用,了解常见的消息类型

文章目录 前言一、初识消息队列 MQ1.1 同步通信1.2 异步通信1.3 MQ 常见框架及其对比 二、初识 RabbitMQ2.1 什么是 RabbitMQ2.2 RabbitMQ 的结构 三、基于 Docker 部署 RabbitMQ四、常见的消息类型五、示例&#xff1a;在 Java 代码中通过 RabbitMQ 发送消息5.1 消息发布者5.2…

【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

目录 1. 题目1.1 存储过程1.2 存储函数1.3 事务处理 2. 解答2.1 存储过程2.2 存储函数2.3 事务处理 1. 题目 1.1 存储过程 创建表 RandNumber &#xff1a;字段&#xff1a;id 自增长&#xff0c; data int&#xff1b; 创建存储过程向表中插入指定个数的随机数&#xff08;1-…

UDP通信程序的详细解析

2.UDP通信程序 2.1 UDP发送数据 Java中的UDP通信 UDP协议是一种不可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象&#xff0c;但是这两个Socket只是发送&#xff0c;接收数据的对象&#xff0c;因此对于基于UDP协议的通信双方而言&#xff0c;没有所谓的客户端…

MySql017——组合查询UNION和UNION ALL

一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句&#xff0c;在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成&#xff0c;语句之间用关键字UNION分隔&#xff…

Hive 【Hive(七)窗口函数练习】

窗口函数案例 数据准备 1&#xff09;建表语句 create table order_info (order_id string, --订单iduser_id string, -- 用户iduser_name string, -- 用户姓名order_date string, -- 下单日期order_amount int -- 订单金额 ); 2&#xff09;装载语句 i…

代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离

目录 583. 两个字符串的删除操作思路思路2代码 72. 编辑距离思路代码 583. 两个字符串的删除操作 Leetcode 思路 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。递推公…

【AI视野·今日NLP 自然语言处理论文速览 第四十八期】Thu, 5 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 5 Oct 2023 Totally 50 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Retrieval meets Long Context Large Language Models Authors Peng Xu, Wei Ping, Xianchao Wu, Lawrence McA…

算法题:摆动序列

这道题是一道贪心算法题&#xff0c;如果前两个数是递增&#xff0c;则后面要递减&#xff0c;如果不符合则往后遍历&#xff0c;直到找到符合的。&#xff08;完整题目附在了最后&#xff09; 代码如下&#xff1a; class Solution(object):def wiggleMaxLength(self, nums):…

【力扣-每日一题】714. 买卖股票的最佳时机含手续费

class Solution { public:int maxProfit(vector<int>& prices, int fee) {//[i][0]-不持有 [i][1]-持有int mprices.size();vector<vector<int>> dp(m,vector<int>(2));dp[0][0]0; //初始状态dp[0][1]-prices[0];for(int i1;i<m;i){dp[i]…

光伏发电预测(LSTM、CNN_LSTM和XGBoost回归模型,Python代码)

光伏太阳能电池通过互连形成光伏模块&#xff0c;以捕捉太阳光并将太阳能转化为电能。因此&#xff0c;当光伏模块暴露在阳光下时&#xff0c;它们会产生直流电。这是目前将太阳能转化为电能的最佳方式之一。世界上许多国家已经采用了这项技术&#xff1b;然而&#xff0c;光伏…

Unity解决:安卓打包设置项目名称为中文名 packageName为英文包名

把productName改成中文名&#xff0c;然后在OtherSettings里面重写默认的包名就可以了

Android:实现手机前后摄像头预览同开

效果展示 一.概述 本博文讲解如何实现手机前后两颗摄像头同时预览并显示 我之前博文《OpenGLES&#xff1a;GLSurfaceView实现Android Camera预览》对单颗摄像头预览做过详细讲解&#xff0c;而前后双摄实现原理其实也并不复杂&#xff0c;粗糙点说就是把单摄像头预览流程写两…

抄写Linux源码(Day19:读取硬盘前的准备工作有哪些?)

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

如何在VMware workstation虚拟机中安装ensp(完美运行),解决报错40

如何在VMware workstation虚拟机中安装ensp&#xff08;完美运行&#xff09; 效果如图&#xff1a; 问题体现是ensp的路由器报错40&#xff0c;这是vbox相关的问题 在虚拟机中安装ensp的关键其实是vbox&#xff08;ensp依赖vbox&#xff09; ensp自带的vbox版本太低&#x…

想要精通算法和SQL的成长之路 - 存在重复元素

想要精通算法和SQL的成长之路 - 存在重复元素 前言一. 存在重复元素II二. 存在重复元素III2.1 基于红黑树增删改查 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 存在重复元素II 原题链接 思路&#xff1a; 我们用HashSet存储元素&#xff0c;做到去重的效果。同时存储…

防火墙的相关技术

安全技术&#xff1a;&#xff08;市场上常见的防御&#xff09; 1.入侵检测机制 阻断&#xff0c;量化&#xff0c;定位来自内外的网络的威胁情况 提供报警和事后监督。类似于监控。 2.入侵防御 以透明模式工作&#xff0c;分析数据包的内容&#xff0c;一切进入本机的内容…