Qt容器类

Qt提供了多个基于模板的容器类,例如QStringList可以用来操作QList<QString>列表。Qt还提供了一个宏foreach用于遍历容器内的所有数据项

Qt容器分为顺序容器和关联容器类

注意:Qt6的QVector是QList的别名!

顺序容器

QList 

它用连续的存储空间存储一个列表的数据,可以通过序号访问列表的数据,但在列表的开始和中间插入数据会比较慢!因为需要移动大量的数据。

    QList<T>
    QList<float> listF = {1.2,2.2,5.5};
    QList<QString> listS;

 通过流操作符"<<"或者append()向列表添加数据

    QList<QString> listS;
    listS<<"sss"<<"aaa"<<"lll";
    listS.append("kkk");
    QList<QString> listS;
    listS<<"sss"<<"aaa"<<"lll"<<"sss";
    listS.append("kkk");//在列表末端添加数据
    listS.prepend("FFF");//在列表始端添加数据
    listS.insert(0,"ddd");//在列表的第0个位置插入数据(这个位置是从0开始)
    listS.replace(0,"cccc");//替换列表的第0个位置的数据
    qDebug()<<listS.at(0);//返回某个索引对应的元素
    listS.clear();//清除列表的所有元素,元素个数变为0
    qDebug()<<listS.size();//输出元素个数
    qDebug()<<listS.count("sss");//统计某个元素出现的个数,不带参数时等价与size()
    listS.reserve(10);//给列表预先分配内存,但不改变列表长度
    qDebug()<<listS.size();//测试列表长度,此时还是0
    qDebug()<<listS.isEmpty();//是否为空
    listS<<"kkk"<<"fff"<<"ccc";
    listS.removeAt(0);//移除第0个数据
    listS<< "sun" << "cloud" << "sun" << "rain";
    listS.removeAll("sun");//移除所有的sun
    qDebug()<<listS.takeAt(0);//移除并返回数据
    // 使用 foreach 遍历列表
    foreach (QString i,listS) {
        qDebug() << i;
    }

QStack

QStack是QList的子类,QStack<T>提供了类似栈的后进先出的容器

    QStack<QString> stack;
    //stack<<"lll"<<"aaa"<<"ccc";//不正确的添加,建议使用pop和push
    stack.push("kkk");
    stack.push("fff");
    foreach(QString i,stack){
        qDebug()<<i;
    }
    stack.pop();
    foreach(QString i,stack){
        qDebug()<<i;
    }
    while (!stack.isEmpty()) {
        qDebug()<<stack.pop();
    }    

QQueue

队列类,先进先出

    QQueue<QString> que;
    que.enqueue("kkk");
    que.enqueue("fff");
    que.enqueue("ccc");
    while (!que.isEmpty()) {
        qDebug()<<que.dequeue();
    }

关联容器

QSet

基于哈希表的集合模板类,查找速度快

    QSet<QString> set;
    set<<"www"<<"hhhh"<<"aaaa"<<"qqq";
    qDebug()<<set.contains("www");//集合是否包含该元素

QMap

QMap<Key,T>定义字典(关联数值),是按顺序存储的。如果不介意顺序可以使用QHash 

    QMap<QString,int> map;
    map["one"] = 888;
    map["kkk"] = 50;
    //查找某个值可以使用[]或value()
    qDebug()<<map["kkk"];
    qDebug()<<map.value("one");
    map.insert("sss",77);//插入
    map.remove("one");//移除
    //在映射表若没有找到指定值,会返回一个默认值或者自己指定
    qDebug()<<map.value("oqqqne");
    qDebug()<<map.value("oqqqne",-1);

QMultiMap

多值映射表,即一个键对应多个值,QMultiMap<Key,T>

    QMultiMap<QString,int> map1,map2,map3;
    map1.insert("kkk",888);
    map1.insert("kkk",999);
    qDebug()<<map1.values("kkk");//+s返回多个值
    qDebug()<<map1.value("kkk");//返回最新插入的值
    map2.insert("kkk",777);
    map3 = map1 + map2;
    qDebug()<<map3.values("kkk");
    //values返回值是QList<T>类型
    QList<int> v = map3.values("kkk");
    for (int i = 0;i<v.size();i++) {
        qDebug()<<v.at(i);
    }

### 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、付费专栏及课程。

余额充值