QT 容器类QList类、QLinkedList类和QVector类 QList类 QLinkedList类 QVector类 QMap类和QHash类 QMap类 QHash类 STL风格迭代器遍

QT 容器类QList类、QLinkedList类和QVector类 QList类 QLinkedList类 QVector类 QMap类和QHash类 QMap类 QHash类 STL风格迭代器遍

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

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

QT容器类是可以嵌套的

QHash<QString,QList<double>>

【1】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_iterator QList<T>::iterator
QLinkedList<T> QLinkedList<T>::const_iterator QLinkedList<T>::iterator
QVector<T>,QStack<T> QVector::const_iterator QVector<T>::iterator
#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();
}

【2】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_iterator QMap<Key,T>::iterator
QHash<Key,T>QMultiHash<Key,T> QHash<Key,T>QMultiHash<Key,T>``QHash<Key,T>::const_iterator QHash<Key,T>::iterator
#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();
}

猜你喜欢

转载自blog.csdn.net/m0_45463480/article/details/130439445