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

相关推荐
无敌最俊朗@几秒前
C++后端总览
开发语言
多喝开水少熬夜6 分钟前
堆相关算法题基础-java实现
java·开发语言·算法
R-G-B10 分钟前
【P1】win10安装 Docker教程
运维·docker·容器
7澄113 分钟前
Java 集合框架:List 体系与实现类深度解析
java·开发语言·vector·intellij-idea·集合·arraylist·linkedlist
菜鸟祥哥35 分钟前
xfs文件系统磁盘损坏修复
linux
Y淑滢潇潇41 分钟前
RHCE Day2 时间管理服务器 NFS服务器
linux·运维·服务器
mit6.82442 分钟前
一些C++的学习资料备忘
开发语言·c++
Industio_触觉智能43 分钟前
开源鸿蒙SIG-Qt技术沙龙成都站成功举办,产品方案展示
qt·harmonyos·openharmony·开源鸿蒙·sig-qt
Adellle1 小时前
Java中同步和异步的区别,以及阻塞和非阻塞的区别
java·开发语言
铭哥的编程日记1 小时前
【Linux网络】五种IO模型与非阻塞IO
linux·服务器·网络·tcp/ip·udp