QT基础之容器类

更多参见
QT基础与实例应用目录

QT提供了一组通用的基于模板的容器类。存储在QT容器类中数据必须是可赋值的数据类型,也就是说,这种数据类型必须提供一个默认的构造函数、一个复制构造函数和一个赋值操作运算符。
这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如int和double等)和QT的一些数据类型(如QString、QDate和QTime等),但QT的QObject及其他的子类(如QWidget QDialog等)不能够存储在容器中,可以存储QObject及其他的子类的指针

QList<QToolBar> list; // 无法通过编译
QList<QToolBar*> list; // 通过编译

QT容器类是可以嵌套的

QHash<QString,QList<double>>

QList类、QLinkedList类和QVector类

QList类

QList<T>是最常用的容器类,它存储给定数据类型T的一列数值。继承自QList 的子类有 QByteArrayList, QItemSelection, QQueue, and QStringList等。

QList<T>维护了一个指针数组,该数组存储的指针指向QList<T>存储的列表项的内容。因此,QList<T>支持基于下标的快速访问。

对于不同数据类型,QList<T>采取不同的存储策略。

(1)如果T是一个指针或者指针大小的基本类型(占用字节数相同),QList<T>会将数值直接存储在它的数组中

(2)如果QList<T>存储对象的指针,则该指针指向实际存储的对象

QLinkedList类

QLinkedList<T>是一个链式列表,以非连续的内存存储数据,不能使用下标只能使用迭代器访问数据项

QVector类

QVector<T>在相邻的内存中存储给定数据类型T的一组数值。在QVector的前部或中部位置进行插入操作的速度很慢,因为会存在大量的数据搬移操作。QLinkedList<T>既可以使用下标访问数据项,也可以使用迭代器访问数据项。

STL风格迭代器遍历容器

容器类只读迭代器读写迭代器
QList<T>,QQueue<T>QList<T>::const_iteratorQList<T>::iterator
QLinkedList<T>QLinkedList<T>::const_iteratorQLinkedList<T>::iterator
QVector<T>,QStack<T>QVector::const_iteratorQVector<T>::iterator

GitHub链接: GitHub

#include <QApplication>
#include <QDebug>

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

    QList<int> list;
    for(int j=0; j<10; j++){
        list.append(j);
    }

    QList<int>::iterator i;
    for(i=list.begin();i!=list.end();++i){
        qDebug() << (*i);
        *i = (*i) * 10;
    }

    QList<int>::const_iterator ci;
    for(ci = list.constBegin();ci!=list.constEnd();++ci){
        qDebug() << (*ci);
    }

    return a.exec();
}

QMap类和QHash类

QMap类和QHash类具有很多类似的功能,但也有差别:

  • QHash有比QMap更快的查找速度
  • QHash以任意顺序存储数据项,而QMap总是按照键 Key的顺序存储数据
  • QHash的键类型 Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型 Key必须提供operator<=()函数

QMap类

QMap<Key,T>提供一个从类型为Key的键到类型为T的值得映射。

QHash类

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

STL风格迭代器遍历容器

容器类只读迭代器读写迭代器
QMap<Key,T>QMultiMap<Key,T>QMap<Key,T>::const_iteratorQMap<Key,T>::iterator
QHash<Key,T>QMultiHash<Key,T>QHash<Key,T>QMultiHash<Key,T>``QHash<Key,T>::const_iteratorQHash<Key,T>::iterator

GitHub链接: GitHub

#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMap<QString,QString> map;
    map.insert("abc","123");
    map.insert("def","456");
    map.insert("hij","789");

    QMap<QString,QString>::const_iterator ci;
    for(ci=map.constBegin();ci!=map.constEnd();ci++){
        qDebug() << "Key = " << ci.key() << ", Value = " << ci.value();
    }

    QMap<QString,QString>::iterator i;
    i = map.find("abc");
    if(i!=map.end()){
        i.value() = "000";
    }
    qDebug() << "------------";
    QMap<QString,QString>::const_iterator ci2;
    for(ci2=map.constBegin();ci2!=map.constEnd();ci2++){
        qDebug() << "Key = " << ci2.key() << ", Value = " << ci2.value();
    }

    return a.exec();
}

希望我的文章对于大家有帮助,由于个人能力的局限性,文中可能存在一些问题,欢迎指正、补充!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值