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

相关推荐
郝学胜-神的一滴2 分钟前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
珂玥c3 分钟前
k8s集群网络插件caclico切换为flannel
云原生·容器·kubernetes
测试员周周5 分钟前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
宏笋11 分钟前
C++ thread的detach()方法详解
c++
旖-旎16 分钟前
深搜练习(单词搜索)(12)
c++·算法·深度优先·力扣
Zhu75824 分钟前
【问题处理】minIO(AIStor)在k8s部署后,API访问失败的问题,TLS
云原生·容器·kubernetes
摇滚侠28 分钟前
@Autowired 和 @Resource 的区别
java·开发语言
Wy_编程37 分钟前
go语言中的结构体
开发语言·后端·golang
IT大白鼠39 分钟前
Linux进程与计划任务管理:技术详解与实战指南
linux·运维·服务器
SeaTunnel43 分钟前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源