Qt 常见容器类用法(一)

目录

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

结果如下: 

相关推荐

  1. Qt-容器

    2024-02-07 02:56:03       43 阅读
  2. Qt容器QHash

    2024-02-07 02:56:03       37 阅读
  3. Qt容器

    2024-02-07 02:56:03       35 阅读
  4. Qt基础-容器详解

    2024-02-07 02:56:03       40 阅读
  5. qt5-入门-容器

    2024-02-07 02:56:03       16 阅读
  6. Qt 顺序容器与关联容器

    2024-02-07 02:56:03       11 阅读
  7. C++ Qt开发:使用关联容器

    2024-02-07 02:56:03       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 02:56:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 02:56:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 02:56:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 02:56:03       20 阅读

热门阅读

  1. 达梦数据库主备切换知识

    2024-02-07 02:56:03       33 阅读
  2. 二维前缀和公式 AcWing 796. 子矩阵的和

    2024-02-07 02:56:03       33 阅读
  3. 2.4学习总结

    2024-02-07 02:56:03       33 阅读
  4. algo-桶排序

    2024-02-07 02:56:03       34 阅读
  5. Android截屏方法

    2024-02-07 02:56:03       26 阅读
  6. C++枚举算法(3)

    2024-02-07 02:56:03       33 阅读
  7. QT 应用程序中集成浏览器

    2024-02-07 02:56:03       31 阅读
  8. js 基础

    js 基础

    2024-02-07 02:56:03      25 阅读