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

相关推荐
西阳未落23 分钟前
C++基础(21)——内存管理
开发语言·c++·面试
我的xiaodoujiao1 小时前
Windows系统Web UI自动化测试学习系列2--环境搭建--Python-PyCharm-Selenium
开发语言·python·测试工具
callJJ1 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
月殇_木言1 小时前
Linux 线程
linux
超级大福宝1 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
wangjialelele1 小时前
Linux中的线程
java·linux·jvm·c++
hsjkdhs2 小时前
万字详解C++之构造函数析构函数
开发语言·c++
2301_800050993 小时前
DNS 服务器
linux·运维·笔记
Lin_Aries_04213 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc
SELSL3 小时前
SQLite3的API调用实战例子
linux·数据库·c++·sqlite3·sqlite实战