Qt 常见容器类用法(一)

news2024/11/17 2:53:24

目录

QMap类

QHash类

QVector类


QMap类

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

#include <QCoreApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    //QMap类
    //1.创建QMap示例,第一个参数为QString类型的键,第二个参数为int类型的值
    QMap<QString,int> qmap;

    // 插入数据信息,他有两种方式操作
    qmap["Chinese"]=119;
    qmap["English"]=120;
    qmap.insert("Math",115);
    qmap.insert("Physics",99);
    qmap.insert("Chemistry",100);
    qDebug()<<qmap;

    // 删除数据信息key键
    qmap.remove("Chemistry");
    qDebug()<<qmap<<endl;

    // 遍历QMap类的示例,数据信息
    // 1.迭代器(java类型的迭代操作)   QMapIterator是Qt框架中用于迭代QMap的迭代器类,它提供了遍历QMap中键值对的功能
    QMapIterator<QString,int> itr(qmap);
    while(itr.hasNext())      // 在while循环中,使用hasNext()函数检查是否还有下一个键值对待迭代。
    {
        itr.next();            // 调用next()函数将迭代器移动到下一个键值对,并可以通过key()和value()函数获取当前键和值的信息。
        qDebug()<<itr.key()<<": "<<itr.value();
    }
    qDebug()<<endl;
    // 2.STL类型的迭代  QMap<QString, int>::const_iterator是QMap的常量迭代器类型,用于遍历QMap中的键值对。
    QMap<QString,int>::const_iterator stritr=qmap.constBegin();   // 通过调用constBegin()函数获取QMap的起始迭代器,并将其赋值给stritr。
    while(stritr!=qmap.constEnd())  // 在while循环中,使用stritr != qmap.constEnd() 条件判断是否还有下一个键值对待迭代。
    {
        qDebug()<<stritr.key()<<":"<<stritr.value();
        stritr++;
    }
    // Key键/T键-->来查找
    qDebug()<<endl;
    qDebug()<<"key-->T:"<<qmap.value("Math");
    qDebug()<<"T-->key:"<<qmap.key(99)<<endl;

    // 修改键值
    // 一个键对应一个值,再次调用insert()函数将覆盖之前的值
    qmap.insert("Math",118);
    qDebug()<<qmap.value("Math");

    // 查询是否包含某个键
    qDebug()<<endl;
    qDebug()<<"result="<<qmap.contains("Chinese");
    qDebug()<<"result="<<qmap.contains("Chemistry");

    // 输出所有QMap实例化:Key键和T值
    qDebug()<<endl;
    QList<QString> aKeys=qmap.keys();
    qDebug()<<aKeys;
    QList<int> aValues=qmap.values();
    qDebug()<<aValues;

    // 一个键对应多个值
    // 直接使用QMultiMap类来实例化一个QMap对象
    qDebug()<<endl;
    QMultiMap<QString,QString> mulmap;
    mulmap.insert("student","no");
    mulmap.insert("student","name");
    mulmap.insert("student","sex");
    mulmap.insert("student","age");
    mulmap.insert("student","high");
    mulmap.insert("student","weight");
    qDebug()<<mulmap; // 从输出结果可以看出mulmap仍然是一个QMap对象

    return a.exec();
}

结果如下:

QHash类

QHash<Key,T>具有与QMap几乎完全相同的API。QHash维护者一张哈希表(Hash Table),哈希表的大小与QHash的数据项的数据相适应。QHash以任意的顺序组织它的数据,当存储数据的顺序无关紧要时,建议使用QHash作为存放数据的容器。

#include <QCoreApplication>

#include <QDebug>

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

    QHash<QString,int> qhash;

    qhash["key 1"] = 3;
    qhash["key 2"] = 8;
    qhash["key 3"] = 4;
    qhash["key 4"] = 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"]=33;
    hash["key 2"]=44;
    hash["key 3"]=55;
    hash["key 4"]=66;
    hash.insert("key 3",100);

    QHash<QString,int>::const_iterator iterator;
    for(iterator=hash.begin();iterator!=hash.end();iterator++)
        qDebug()<<iterator.key()<<"-->"<<iterator.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<T>是Qt的一个容器类
    QVector<int> qvr;
    // 第一种赋值方式
    qvr<<10;
    qvr<<20;
    qvr<<30;
    qvr<<40;
    // 第二种赋值方式
    qvr.append(50);
    qvr.append(60);
    qvr.append(70);
    qvr.append(80);
    qvr.append(90);
    qvr.append(100);

    qDebug()<<"qvr count="<<qvr.count()<<endl;

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

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

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

    // 判断容器是否包含某个元素
    qDebug()<<endl;
    qDebug()<<"result="<<qvr.contains(90);
    qDebug()<<"result="<<qvr.contains(901)<<endl;

    return a.exec();
}

结果如下: 

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

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

相关文章

吹响AI PC号角!微软在Windows中不断增加“Copilot含量”

2024&#xff0c;会是AI PC元年吗&#xff1f;至少微软正在往这个方向努力。 本周&#xff0c;微软开始在Windows中测试Copilot的“新体验”&#xff0c;其中包括任务栏中的Copilot图标&#xff0c;当用户复制文本或图片时&#xff0c;Copilot操作菜单就会自动出现。 有媒体在…

C++ dfs 的状态表示(五十一)【第十一篇】

今天我们接着学习dfs&#xff08;状态表示&#xff09;。 1.抽象形式的dfs 前面用到的 DFS 算法都是比较容易想象出搜索过程的&#xff0c;接下来我们看一些不那么容易想象搜索过程的 DFS 过程&#xff0c;这些问题我们称为抽象形式的 DFS。 来回顾一下上节课遇到的一个问题&a…

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述&#xff1a;flag在数据库里面。 开题&#xff1a; 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面&#xff0c;有一个搜索框。 F12看看network。 又出现了这个Wor…

Netty应用(四) 之 Reactor模型 零拷贝

目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现&#xff08;一个Boss线程&#xff0c;一个Worker线程&#xff09; 8.2 多线程Reactor模…

postgresql 手动清理wal日志的101个坑

新年的第一天&#xff0c;总结下去年遇到的关于WAL日志清理的101个坑&#xff0c;以及如何相对安全地进行清理。前面是关于WAL日志堆积的原因分析&#xff0c;清理相关可以直接看第三部分。 首先说明&#xff0c;手动清理wal日志是一个高风险的操作&#xff0c;尤其对于带主从的…

AS自治系统的路由协议--BGP

BGPV4 --- IPV4 --- BGPV4 --- MPBGP --- 支持多种不同的地址组 重发布替代BGP的缺陷&#xff1a; 1&#xff0c;选路不佳 2&#xff0c;ASBR的归属问题 BGP --- 无类别路径矢量协议 1&#xff0c;无类别 --- 在传递路由信息的时候携带子网掩码 2&#xff0c;路径矢量 ---…

【Algorithms 4】算法(第4版)学习笔记 06 - 2.3 快速排序

文章目录 前言参考目录学习笔记1&#xff1a;基本算法1.1&#xff1a;快速排序 demo 演示1.2&#xff1a;快速排序切分代码实现1.3&#xff1a;实现细节1.4&#xff1a;案例分析1.4.1&#xff1a;最佳案例1.4.2&#xff1a;最坏案例1.4.3&#xff1a;平均案例分析1.5&#xff1…

ChatGPT高效提问—prompt常见用法(续篇十)

ChatGPT高效提问—prompt常见用法(续篇十) 1.1 使用引导词 ​ 除了利用prompt引导ChatGPT回答问题,另一种重要的应用场景是让ChatGPT根据需求生成各种内容,比如诗词创作、故事续写、招聘信息编写,甚至是舞台剧剧本创作等。在这些场景中,我们可以采取一个巧妙的策略,那…

使用deepspeed继续训练LLAMA

目录 1. 数据训练配置 2. 模型载入 3. 优化器设置 4. DeepSpeed 设置 5. DeepSpeed 初始化 6. 模型训练 LLAMA 模型子结构&#xff1a; 1. 数据训练配置 利用 PyTorch 和 Transformers 库创建数据加载器&#xff0c;它支持单机或多机分布式训练环境下的数据加载与采样。涉…

C# CAD交互界面-自定义面板集-添加快捷命令(五)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System; using System.Drawing; using System.Windows.Forms; 二、代码说明 [CommandMethod("Cre…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表&#xff1a; 首先要明白是如何用数组实现&#xff0c; 在这里需要用到几个数组&#xff0c;head表示头节点的下标&#xff0c;e[i]表示表示下标为i的值&#xff0c;ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

qt-C++笔记之判断一个QLabel上有没有load图片

qt-C笔记之判断一个QLabel上有没有load图片 code review! 在Qt框架中&#xff0c;QLabel是用来显示文本或者图片的一个控件。如果你想判断一个QLabel控件上是否加载了图片&#xff0c;你可以检查它的pixmap属性。pixmap属性会返回一个QPixmap对象&#xff0c;如果没有图片被加…

MATLAB知识点: ismember函数 判断数组A中的元素是否在数组B中

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.4.5 集合运算 h ismember(A, B)可以判断数组…

单片机在物联网中的应用

单片机&#xff0c;这个小巧的电子设备&#xff0c;可能听起来有点技术性&#xff0c;但它实际上是物联网世界中的一个超级英雄。简单来说&#xff0c;单片机就像是各种智能设备的大脑&#xff0c;它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…

GEE数据集——美国地质调查局历史地形图(更新)

美国地质调查局历史地形图 美国地质调查局地形图的历史可追溯到 19 世纪末&#xff0c;当时美国地质调查局开始着手绘制整个美国的详细地图。1:24,000 比例尺&#xff0c;也称为 7.5 分钟四边形地图&#xff0c;成为最广泛使用的比例尺之一。每张地图覆盖 7.5 分经纬度的区域&a…

第70讲axios后端请求工具类封装

axios工具类封装&#xff1a; // 引入axios import axios from axios;// 创建axios实例 const httpService axios.create({// url前缀-http:xxx.xxx// baseURL: process.env.BASE_API, // 需自定义baseURL:http://localhost:80/,// 请求超时时间timeout: 3000 // 需自定义 })…

vue+springboot前后端视频文件等的上传与展示(基于七牛云)

前言&#xff1a;在初步说明完成功能之前&#xff0c;我会把重要的部分说明下。后续我会细化。 vue视频文件上传 其实这里和图片这些文件就是一样的。因为上传只是把我们想在云端展示的文件按等传输到云端的bucket。然后方便网站去请求引用。 有人问我我就说明下。这种东西无…

【设计模式】23中设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

文件包含漏洞的应用与绕过技巧、防御方法

目录 包含日志文件 包含session 绕过技巧 指定前缀绕过 一、目录遍历 二、编码绕过 指定后缀绕过 一、利用URL 二、利用协议 三、长度截断 四、%00截断 文件包含漏洞防御 上一篇文章和大家介绍了一下文件包含漏洞和PHP伪协议的基本知识和利用PHP伪协议进行文件包含…

js中bind、call、apply 区别(如何实现)

文章目录 一、作用二、区别applycallbind小结 三、实现 一、作用 call、apply、bind作用是改变函数执行时的上下文&#xff0c;简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢&#xff1f;下面举个例子 var name "lucy"; var obj {n…