Qt 常见容器类用法(一)

目录

QMap类

QHash类

QVector类


QMap类

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

cpp 复制代码
#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作为存放数据的容器。

cpp 复制代码
#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存储数据的方式决定的。

cpp 复制代码
#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();
}

结果如下:

相关推荐
锦亦之22336 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
柳鲲鹏9 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶9 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
阳光开朗_大男孩儿15 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople16 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码17 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码20 小时前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt21 小时前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher951121 小时前
qt相关面试题
开发语言·qt·面试
三玖诶1 天前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式