Qt 容器类使用指南

常用Qt容器类

Qt提供了一系列容器类,类似于STL容器但更紧密集成到Qt框架中。常用容器包括:

  1. 顺序容器

    • QList - 最常用的动态数组
    • QVector - 类似QList,在Qt 5后与QList合并
    • QLinkedList - 双向链表
    • QStack - 后进先出堆栈
    • QQueue - 先进先出队列
  2. 关联容器

    • QMap - 键值对,按键排序
    • QMultiMap - 一键多值
    • QHash - 类似QMap但使用哈希表,查找更快
    • QMultiHash - 一键多值的哈希表
    • QSet - 无序集合

何时使用

  • QList:大多数情况下默认选择,适合存储和访问元素
  • QLinkedList:需要频繁在中间插入/删除时
  • QMap/QHash :需要键值对存储时
    • QMap:需要按键排序时
    • QHash:需要更快查找且不关心顺序时
  • QSet:需要快速判断元素是否存在时

关键点

  1. 隐式共享:Qt容器使用写时复制技术,提高性能
  2. 内存管理:存储指针时需注意所有权问题
  3. 迭代器:提供Java风格和STL风格两种迭代器
  4. 线程安全:多个线程读取是安全的,写入需要同步

简单Demo

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <QList>
#include <QMap>
#include <QSet>

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

    // 1. QList示例
    QList<QString> fruits;
    fruits << "Apple" << "Banana" << "Orange";
    qDebug() << "Fruits:" << fruits;
    
    // 遍历QList
    qDebug() << "Iterating QList:";
    for (const auto &fruit : fruits) {
        qDebug() << fruit;
    }

    // 2. QMap示例
    QMap<QString, int> inventory;
    inventory["Apple"] = 10;
    inventory["Banana"] = 5;
    inventory["Orange"] = 8;
    
    qDebug() << "\nInventory:";
    for (auto it = inventory.begin(); it != inventory.end(); ++it) {
        qDebug() << it.key() << ":" << it.value();
    }

    // 3. QSet示例
    QSet<QString> fruitSet;
    fruitSet << "Apple" << "Banana" << "Orange" << "Apple";
    qDebug() << "\nUnique fruits:" << fruitSet;

    // 4. 使用算法
    qDebug() << "\nContains Banana?" << fruits.contains("Banana");
    qDebug() << "Apple count in inventory:" << inventory.value("Apple");

    return a.exec();
}

高级用法示例

cpp 复制代码
// 存储指针时的内存管理
QList<QObject*> objectList;
QObject *obj1 = new QObject();
QObject *obj2 = new QObject();
objectList << obj1 << obj2;

// 使用范围for修改元素
QList<int> numbers = {1, 2, 3, 4, 5};
for (int &num : numbers) {
    num *= 2;
}
qDebug() << "Doubled numbers:" << numbers;

// 使用STL算法
#include <algorithm>
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
qDebug() << "Sorted descending:" << numbers;

性能考虑

  1. QList对于存储指针类型非常高效
  2. QHash查找比QMap快,但消耗更多内存
  3. 频繁在中间插入/删除考虑QLinkedList
  4. 大量数据时考虑使用STL容器(如std::vector)

Qt容器与STL容器可以互相转换,根据具体需求选择合适的容器类型。

相关推荐
YuforiaCode6 分钟前
第十五届蓝桥杯 2024 C/C++组 合法密码
c语言·c++·蓝桥杯
xll_00712 分钟前
使用Python设置excel单元格的字体(font值)
开发语言·python·excel
芦屋花绘18 分钟前
Java的JUC详细全解
java·开发语言·jvm·spring boot·kafka
用手码出世界21 分钟前
【Linux】信号
linux·运维·服务器
我最厉害。,。25 分钟前
-PHP 反序列化&POP 链构造&魔术方法流程&漏洞触发条件&属性修改
开发语言·php
哎呀码爷28 分钟前
【源码分析】Linux内核ov13850.c
linux·c语言·单片机
海棠蚀omo29 分钟前
C++笔记-stack_queue(含deque,priority_queue,仿函数的讲解)
开发语言·c++·笔记
lfwh32 分钟前
Java 实现单链表翻转(附详细注释)
java·开发语言·python
YUELEI1181 小时前
Centos9安装docker
运维·docker·容器
世事如云有卷舒1 小时前
《C++ Primer》学习笔记(四)
c++·笔记·学习