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容器可以互相转换,根据具体需求选择合适的容器类型。

相关推荐
肆忆_16 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
chlk12318 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑19 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件19 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
不想写代码的星星20 小时前
虚函数表:C++ 多态背后的那个男人
c++
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
端平入洛3 天前
delete又未完全delete
c++