Qt容器类QList、QLinkedList和QVector类

QList< T >是迄今为止最常用的容器类,它储存给定数据类型T的一系列数值,相对于其他Qt容器类,QList被高度优化。QList< T >维护了一个指针数组,该数组存储的指针指向QList< T >存储的列表项的内容。因此它提供了基于下标的快速访问。
对于不同的数据类型,QList采取不同的存储策略:

  1. 如果T是一个指针类型或指针大小的基本类型(即该类型所占的字节数和指针类型所占的字节数相同),QList会直接将数值存储在它的数组中。
  2. 如果存储对象的指针,则该指针指向实际存储的对象。
#include <QCoreApplication>
#include<QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<QString> list;
    {
        QString str("This is a test string ");
        qDebug() << &str;
        list<<str;
    }
    qDebug() << &list[0];
    //此时QList保存了str对象的一个复制
    qDebug()<<list[0] << "How are you";

    return a.exec();
}
/*
0x65fd60
0xee3ad0
"This is a test string " How are you
*/

QLinkedList类

QLinkedList< T >是一个链表,它是以非连续的内存保存数据。它不能使用下标,只能使用迭代器访问数据项。与QList相比,它在插入和删除操作时具有更高的效率。

QVector类

QVector< T >在相邻的内存中存储给定的数据类型T的一组数据。在QVector中做插入操作速度很慢,因为这样的操作将导致内存中大量的数据被移动。它既可以使用下标访问数据项,也可以使用迭代器访问数据项。

STL风格迭代器

对于每个容器类,Qt都提供了两种类型的STL风格的迭代器数据类型:

  • 只读迭代器 ConstIterator
  • 读写迭代器 iterator
    由于只读迭代器的运行速度比读写迭代器的运行速度快,所以尽可能使用只读类型。
#include <QCoreApplication>
#include<QDebug>
int main(int argc, char *argv[])
{
    QList<int> list;
    for(int j=0;j<10;j++){
        list.insert (list.end (),j);
    }
    // 读写迭代器
    QList<int>::Iterator i;
    for( i = list.begin (); i!=list.end ();i++){

        *i = (*i)+10;
        qDebug() << *i;
    }
    //只读迭代器
    QList<int>::ConstIterator j;
    for( j = list.begin (); j!=list.end ();j++){
        qDebug() << *j;
    }

    return 0;
}

QMap类和QHash类

它们类似与C++STL中的map和unordered_map之间的关系,区别在于:

  • QHash具有更快的查找速度
  • QMap总是按照键key的顺序来存储数据,而QHash则是无序的。
  • QHash的键类型key必须提供 operator==()和一个全局的哈希函数qHash(key)函数,而QMap的键key必须提供 operator < ()函数。
#include <QCoreApplication>
#include<QDebug>
#include <map>
int main(int argc, char *argv[])
{
    QMap<int,QString> map;
    //比C++中的插入操作更简单,C++的插入需要用大括号包含键值对 {key,value}
    map.insert (1,"Mon");
    map.insert (3,"Wed");
    map.insert (2,"Tue");
    map.insert (4,"Thur");
    //创建一个只读迭代器
    QMap<int,QString>::ConstIterator it;
    for(it = map.constBegin (); it != map.constEnd ();it++){
        //在C++中,使用first()和second()来表示键值对
        qDebug() << "key: "<<it.key()<<" value: "<<it.value ();
    }
    //读写迭代器
    QMap<int,QString>::Iterator find_it;
    //如果找不到,就返回end()
    find_it = map.find (3);
    if(find_it != map.end ()){
        find_it.value () = "WED";
    }
    qDebug() << "修改后:";
    for(it = map.constBegin (); it != map.constEnd ();it++){
        qDebug() << "key: "<<it.key()<<" value: "<<it.value ();
    }
    return 0;
}

QVariant类

QVariant类类似于C++的联合(union)数据类型。它不仅能保存很多Qt类型的值,包括QColor,QBrush、QFont…也能存放Qt的容器类型的值。Qt的很多功能都是建立在QVariant基础上,如Qt的对象属性及数据库功能。

#include "widget.h"
#include<QVariant>
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QVariant v(709);
    qDebug() << v.toInt ();
    QVariant w("A Better Tomorrow");
    qDebug() << w.toString ();
    QMap<QString,QVariant> map;
    map["int"] = 709;
    map["double"] = 709.709;
    map["string"] = "You are THE BEST";
    map["color"] = QColor(255,0,0);
    //调用相应的转换函数并输出
    qDebug() << map["int"]<<map["int"].toInt ();
    qDebug() << map["double"]<<map["double"].toDouble ();
    qDebug() << map["string"]<<map["string"].toString ();
    qDebug() << map["color"]<<map["color"].value<QColor>();
    //创建一个字符串列表
    QStringList sl;
    sl<<"A"<<"B"<<"C"<<"D";
    //将该列表保存在一个QVariant变量中
    QVariant slv(sl);
    qDebug() << slv.type ();
    //判断类型
    if(slv.type () == QVariant::StringList){
        QStringList list = slv.toStringList ();
        for(auto x:list){
            qDebug() << x;
        }
    }
}
/*
709
"A Better Tomorrow"
QVariant(int, 709) 709
QVariant(double, 709.709) 709.709
QVariant(QString, "You are THE BEST") "You are THE BEST"
QVariant(QColor, QColor(ARGB 1, 1, 0, 0)) QColor(ARGB 1, 1, 0, 0)
QVariant::QStringList
"A"
"B"
"C"
"D"
*/
Widget::~Widget()
{
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SOC罗三炮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值