QT 容器

 

 

简介
QList<T>这是目前最常用的容器类。他存储了给定类型的值的一个列表,而这些值可以通过索引访问。在内部,QList使用数组来实现,以确保进行快速的基于索引的访问。可以使用QList::append()和QList::preappend()在列表的两端添加项目,也可以使用QList::insert()在列表的中间插入项目。常用的QStringList继承自QList<QString>.
QLinkedList<T>除了使用迭代器而不使用整数索引进行项目访问外,他基本与QList相当。当向一个很大的列表的中间插入项目时,QLinkedList比QList拥有更好的性能,而且它拥有更好的迭代器语义。(当迭代器指向一个QLinkedList的一个项目后,只要这个项目还存在,那么迭代器就依然有效;而当迭代器指向QList中的一个项目后,如果QList进行了插入或者删除操作,那么这个迭代器就无效了)
QVector<T>它在内存的相邻位置存储给定类型的值的一个数组。在vector的前面或者中间插入项目是非常缓慢的,因为这样可能导致大量的项目在内存中移动一个位置。
QStack<T>它是QVector的一个便捷子类,提供了后进先出LIFO语义。它添加了push()、pop()和top()等函数
QQueue<T>它是QList的一个便捷子类,提供了先进先出FIFO语义。他添加了enqueue()、dequeue()和head()等函数
QSet<T>它提供了可以快速查询单值的数学集
QMap<key,T>它提供了一个字典(关联数组),将key类型的键值映射到T类型的值上。一般一个键关联一个单一的值。QMap使用键顺序来存储它的数据;如果不关心存储顺序,那么可以使用QHash来代替它,因为QHash速度更快。
QMultiMap<key,T>他是QMap的一个便捷类,提供了多值映射的接口函数,例如一个键可以关联多个值
QHash<key,T>它与QMap拥有基本相同的接口,但是它的查找速度更快。QHash的数据是以任意的顺序存储的
QMultiHash<key,T>它是QHash的一个便捷类,提供了实现多值散列的接口函数

 

QList示例

#include <QCoreApplication>
#include <QList>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<QString> list;
    list<<"aa"<<"bb"<<"cc";     //插入项目
    if(list[1] == "bb")
        list[1] = "ab";
    list.replace(2,"bc");       //将"cc"换为"bc"
    qDebug()<<"the list is:";   //输出整个列表
    for(int i = 0;i<list.size();i++)
    {
        qDebug()<<list.at(i);
    }
    list.append("dd");          //在列表尾部添加
    list.prepend("mm");         //在列表头部添加
    QString str = list.takeAt(2);//从列表中删除第三个项目,并获取它
    qDebug()<<"at(2) item is:"<<str;
    qDebug()<<"the list is:";   //输出整个列表
    for(int i = 0;i<list.size();i++)
    {
        qDebug()<<list.at(i);//使用at比使用[]速度要快得多
    }
    list.insert(2,"mm");    //在位置2插入项目
    list.swap(1,3);         //交换项目1和项目3
    qDebug()<<"the list is:";   //输出整个列表
    for(int i = 0;i<list.size();i++)
    {
        qDebug()<<list.at(i);
    }
    qDebug()<<"contains 'mm'?"<<list.contains("mm");//  列表中是否包含"mm"
    qDebug()<<"the 'mm' count:"<<list.count("mm");//包含"mm"的个数
    //第一个"mm"的位置,默认从位置0开始往前查找,返回第一个匹配的项目的位置
    qDebug()<<"the first 'mm' index:"<<list.indexOf("mm");
    //从第二个"mm"的位置,我们指定从位置一开始往前查找
    qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",1);
    list.append("qw");
    list.append("er");
    //删除指定位置
    list.removeAt(1);
    //移动
    list.move(2,3);
    //删除第一个
    list.removeFirst();
    //删除最后一个
    list.removeLast();
    //获取第一个并删除第一个
    str = list.takeFirst();
    //获取最后一个并删除最后一个
    str = list.takeLast();

    return a.exec();
}

QMap示例:

#include <QCoreApplication>
#include <QList>
#include <QDebug>
#include <QMap>
#include <QMultiMap>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QMap<QString ,int> map;
    map["one"] = 1;             //向map中插入("one",1)
    map["three"] = 3;
    map.insert("seven",7);      //使用insert函数进行插入
    //获取键的值,使用"[]"操作符时,如果map中没有该键,那么会自动插入
    int value1 = map["six"];
    qDebug()<<"value1:"<<value1;
    qDebug()<<"contains 'six'?"<<map.contains("six");
    //使用value()函数获取该键的值,这样当键不存在时不会自动插入
    int value2  = map.value("five");
    qDebug()<<"value2:"<<value2;        //value2=0
    qDebug()<<"contains 'five'?"<<map.contains("five");
    //当键不存在时,value()的默认返回0,这里可以设定该值,比如这里设值为9,不会插入"nine"
    int value3 = map.value("nine",9);
    qDebug()<<"value3:"<<value3;
    //map默认是一个键对应一个值,如果重新给该键设置了值,那么以前的会被擦出
    map.insert("ten", 10);
    map.insert("ten",100);
    qDebug()<<"ten:"<<map.value("ten");
    //可以使用insertMulti()函数来实现一键多值,然后使用values()函数来获取值的列表
    map.insertMulti("two",2);
    map.insertMulti("two",4);
    QList<int> values = map.values("two");
    qDebug()<<"two:"<<values;
    //也可以使用QMultiMap来实现一键多值
    QMultiMap<QString,int> map1,map2,map3;
    map1.insert("values",1);
    map1.insert("values",2);
    map2.insert("values",3);
    //可以进行相加,这样map3的values键将包含2,1,3三个值
    map3 = map1 + map2;
    QList<int> myValues = map3.values("values");
    qDebug()<<"the values are:";
    for(int i = 0; i < myValues.size();i++)
    {
        qDebug()<<myValues.at(i);
    }
    return a.exec();
}

 

 

 

### Qt 容器类概述 Qt 提供了一系列高效的容器类来存储和管理数据集合。这些容器类被设计成模板化,可以容纳任何类型的对象[^1]。 #### QList 类 `QList<T>` 是一个顺序容器,提供了快速的索引操作以及相对快速的追加操作。对于大多数应用场景来说,这是最常用的列表实现方式之一。它内部实现了数组结构,在访问随机位置上的元素时性能较好。 ```cpp // 创建并初始化一个整数型的QList QList<int> numbers; numbers << 1 << 2 << 3; // 访问第一个元素 int firstNumber = numbers.first(); // 追加新元素到末尾 numbers.append(4); ``` #### QLinkedList 类 `QLinkedList<T>` 实现了一个双向链表的数据结构,适合频繁地在中间插入或删除节点的情况。相比于 `QList`, 对于这类操作效率更高;但在通过下标查找特定项的速度上会慢一些。 ```cpp // 初始化字符串类型的QLinkedList QLinkedList<QString> names; names.push_back("Alice"); names.prepend("Bob"); // 遍历整个链接列表打印所有名字 for (auto it = names.begin(); it != names.end(); ++it){ qDebug() << *it; } ``` #### 容器对比 当选择使用哪种容器时,应该考虑具体的应用场景需求: - 如果程序经常执行随机存取或者只需要在一端添加/移除项目,则应优先选用 `QList`. - 当涉及到大量的中部插入与删除动作时,推荐采用 `QLinkedList`. 此外,两种容器都支持迭代器遍历、STL风格算法接口等功能特性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值