qt 链表QList,QLinkedList的常见使用

QList,QLinkedList这俩个链表是qt里面常用的模板类容器,QLinkedList继承自QList.下面先说说QList.

QList类-------------------------------------------

QList,QLinkedList是一个模板类容器,它可以存储多种数据类型.与先前介绍的QString,QStringList,它的方法也非常的类似,常用有:

append()尾部插入元素

prepend()头部插入元素 

insert()指定位置插入元素

replace()替换元素(QLinkedList无)  

at()用下标访问元素(QLinkedList无)   

removeFirst()删除第一个元素

removeLast()删除最后一个元素

removeAt()删除指定位置元素(QLinkedList无)  

removeOne()删除已知元素

clear()清空链表......

    QList<int> list;//模板类容器.

    list<<1<<2<<3<<4<<5<<6<<7<<8;
    list<<9;
    list.append(10);    //尾部添加
    list.prepend(0);    //头部添加
    list.insert(1,99);  //指定位置插入

    list.replace(5,66);//替换元素.方式1
    list[0] = 100;     //对下标进行访问.方式2
    list.at(2);        //访问下标为2的元素

    list.removeFirst(); //删除第一个元素
    list.removeLast();  //删除最后一个元素
    list.removeAt(2);   //删除指定位置元素
    list.removeOne(7);  //删除已知元素
    list.clear();       //清空链表

qt提供了QList俩种风格的迭代器,java和STL.

java风格迭代器-----------

1.

读写迭代器QMutableListIterator<int> 

.

    QList<int> montList;
    QMutableListIterator<int> it_mrw(montLis
<think>好的,我现在需要帮助用户了解Qt中的链表。首先,用户之前询问过QString转16进制的问题,现在转而问链表,可能是在开发中需要处理数据结构。 Qt中的链表主要有两种:QLinkedListQList。但根据Qt文档,QLinkedListQt 5.14之后被标记为废弃,所以应该优先推荐QList或者标准库的std::list。需要确认用户使用Qt版本,但假设用户使用的是较新的版本,所以应该重点介绍QList。 接下来需要解释QList的内部实现,虽然名字是List,但实际上在QtQList更像是一个数组列表,结合了链表和数组的优点,比如快速的随机访问和动态扩展。这点很重要,避免用户误解QList为传统的链表结构。 然后,如果用户确实需要链表结构,应该建议使用标准库的std::list,并说明如何与Qt容器配合使用。比如,使用迭代器操作,或者转换到QList等。 另外,用户可能关心如何在Qt中高效地操作链表,比如插入、删除、遍历等操作。需要提供示例代码,展示基本用法,比如插入元素、遍历链表、删除元素等。同时,要强调不同数据结构的性能特点,比如QList适合随机访问,而std::list适合频繁的插入删除。 还要注意对比QList和std::list的优缺点,帮助用户根据实际需求选择。比如,如果需要与Qt的其他类集成,QList更方便;如果需要高效的中间插入,std::list更好。 最后,提醒用户注意QLinkedList已被弃用,避免他们使用旧的方法。可能还需要提到Qt的foreach宏和C++11的范围for循环在遍历时的应用,增加代码的简洁性。 检查是否有遗漏点,比如内存管理、线程安全等,但用户可能只需要基础介绍,所以暂时不深入。确保代码示例正确,语法无误,并符合Qt的最佳实践。</think>在 Qt 中处理链表结构时,主要可通过以下两种方式实现,需根据实际需求选择: --- ### 一、使用 Qt 容器类 `QList`(推荐) **特点**: - **混合数据结构**:虽然名称含 `List`,但 `QList` 内部实现结合了数组和链表特性,支持快速随机访问(类似 `std::vector`)和动态扩展。 - **性能优化**:针对 Qt 数据类型(如 `QString`、`QVariant`)深度优化,内存连续存储时效率接近数组。 - **兼容性**:与 Qt 其他类无缝集成(如信号槽传递、`QVariant` 转换)。 #### 基本操作示例 ```cpp // 创建链表 QList<QString> list; // 插入元素 list.append("Apple"); // 尾部插入 list.prepend("Banana"); // 头部插入 list.insert(1, "Orange"); // 中间插入 // 遍历 foreach (const QString &item, list) { qDebug() << item; // 输出顺序:Banana, Orange, Apple } // 删除元素 list.removeAt(0); // 删除头部 list.removeLast(); // 删除尾部 ``` --- ### 二、使用 C++ 标准库 `std::list` **适用场景**: - 需要纯链表特性(频繁中间插入/删除) - 跨平台兼容性要求高 - 需与其他标准库算法配合使用 #### 基本操作示例 ```cpp #include <list> // 创建链表 std::list<int> numList; // 插入元素 numList.push_back(10); // 尾部插入 numList.push_front(20); // 头部插入 auto it = numList.begin(); advance(it, 1); numList.insert(it, 30); // 中间插入 // 遍历(C++11范围for循环) for (int num : numList) { qDebug() << num; // 输出顺序:20, 30, 10 } // 删除元素 numList.pop_front(); // 删除头部 numList.erase(it); // 删除指定位置 ``` --- ### 关键对比与选型建议 | 特性 | `QList` | `std::list` | |--------------------|----------------------------------|------------------------------| | **内存结构** | 分块数组(非纯链表) | 双向链表 | | **随机访问** | $O(1)$ | $O(n)$ | | **中间插入/删除** | $O(n)$ | $O(1)$(已知迭代器位置时) | | **Qt生态兼容性** | 完美支持信号槽、序列化等特性 | 需转换容器类型 | | **迭代器稳定性** | 修改操作可能使迭代器失效 | 插入/删除不使其他迭代器失效 | **选型建议**: - 优先选择 `QList`:适用于 90% 的 Qt 应用场景,尤其在需要与 Qt 其他模块交互时 - 使用 `std::list`:当需要高频次中间插入/删除,且数据量较大时 --- ### 三、已弃用的 `QLinkedList` 注意:Qt 5.14 起 `QLinkedList` 被标记为废弃,其功能可通过 `std::list` 或 `QList` 替代。原因为: 1. 实际性能优势不明显 2. 增加 Qt 维护复杂度 3. 与 C++ 标准库重叠 --- ### 高级技巧 #### 1. 与 Qt 信号槽结合 ```cpp // 传递链表数据(自动序列化) QList<QString> dataList = {"A", "B", "C"}; emit sendData(dataList); // 信号声明:void sendData(const QList<QString> &) ``` #### 2. 类型转换 ```cpp // std::list → QList std::list<int> stdList = {1, 2, 3}; QList<int> qtList(stdList.begin(), stdList.end()); // QList → std::list std::list<int> newList(qtList.begin(), qtList.end()); ``` #### 3. 性能优化 ```cpp // 预分配内存(仅QList有效) QList<QString> bigList; bigList.reserve(10000); // 避免多次重分配 // 批量插入 QList<int> source = {1, 2, 3, 4, 5}; bigList.append(source); // 比循环append快5-10倍 ``` --- ### 完整示例:实现链表过滤 ```cpp QList<int> numbers = {5, 12, 8, 15, 3, 20}; // 过滤大于10的数字(Qt方式) QList<int> filtered; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(filtered), [](int x) { return x > 10; }); // 等效于: QList<int> filtered2; foreach (int num, numbers) { if (num > 10) filtered2.append(num); } qDebug() << filtered; // 输出:[12, 15, 20] ``` 通过合理选择容器类型,可以显著提升 Qt 应用的性能和开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值