忧郁的大能猫
好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
| 分类 | Qt 集合类 | 对应的 C++ STL 类 | 主要特点(Qt) | 主要特点(STL) | 使用建议 |
|---|---|---|---|---|---|
| 顺序容器(Sequence) | QVector<T> |
std::vector<T> |
连续内存、支持隐式共享、快速随机访问 | 连续内存、标准性能最高、支持算法库 | Qt 环境下优选 QVector,算法模块用 std::vector |
QList<T> (Qt6≈QVector) |
std::vector<T> / std::deque<T> |
Qt5 时为混合结构、Qt6 改为连续数组、兼容性好 | 动态数组或双端队列实现、性能稳定 | 建议新代码使用 QVector 替代 QList |
|
QLinkedList<T>(Qt6 已弃用) |
std::list<T> / std::forward_list<T> |
传统链表实现,随机访问慢 | 双向/单向链表,插入删除快 | 推荐使用 std::list,Qt 已弃用 |
|
QStringList |
std::vector<std::string> |
方便字符串处理,与 QString 无缝集成 |
需手动转换字符串类型 | GUI 程序推荐使用 | |
QByteArray |
std::vector<char> / std::string |
专为字节流、二进制数据设计 | 可通用但语义不清晰 | 处理二进制/网络数据优选 | |
| 关联容器(Associative) | QMap<Key,Val> |
std::map<Key,Val> |
有序映射、基于红黑树、隐式共享 | 有序映射、红黑树实现、STL标准兼容 | 对 Qt 对象映射使用 QMap |
QMultiMap<Key,Val> |
std::multimap<Key,Val> |
支持键重复、有序 | 同上 | 同上 | |
QHash<Key,Val> |
std::unordered_map<Key,Val> |
哈希表实现、平均 O(1) 查找 | 哈希表、平均 O(1)、泛型算法兼容 | 性能敏感时两者皆可 | |
QMultiHash<Key,Val> |
std::unordered_multimap<Key,Val> |
支持键重复、无序 | 支持键重复、无序 | 同上 | |
QSet<Key> |
std::unordered_set<Key> / std::set<Key> |
基于 QHash 实现、无序集合 |
有序或无序集合可选 | 通常选 QSet 或 std::unordered_set |
|
| 特殊容器 | QVarLengthArray<T,N> |
无直接对应(类似 std::array + 动态扩展) |
小型动态数组,性能极高 | - | 嵌入式或高性能代码推荐 |
QCache<Key,Val> |
无直接对应 | 带缓存回收机制(LRU) | - | 缓存场景专用 | |
| 内存与拷贝机制 | 隐式共享(Copy-on-Write) | 深拷贝(值语义) | 拷贝开销小、写时复制 | 拷贝立即复制数据 | Qt 容器更适合频繁拷贝场景 |
| 线程安全性 | 读操作线程安全(原子引用计数) | 非线程安全 | 可多线程读、写需加锁 | 用户手动加锁 | Qt 多线程环境更友好 |
| 算法兼容性 | 不兼容 <algorithm> 泛型算法 |
完全兼容 <algorithm> |
使用方便但灵活性低 | 泛型算法强大 | 算法部分推荐使用 STL |
| 迭代器风格 | QListIterator, QMutableListIterator 等 |
iterator, const_iterator |
Qt 风格接口更直观 | STL 标准语法、通用性强 | 依使用习惯选择 |
| API 风格 | append(), removeAt(), contains() |
push_back(), erase(), find() |
更接近自然语言 | 更贴近标准库规范 | Qt GUI 推荐 Qt 风格 |
| 性能取向 | 兼顾易用性与 Qt 兼容性 | 注重性能与算法泛用性 | 内存稳定、二进制兼容 | 性能更优、标准一致 | 综合考虑使用场景 |
| 典型使用场景 | GUI、信号槽、QML、QVariant 集成 | 算法库、数值计算、第三方库交互 | 与 Qt 框架无缝衔接 | 跨平台兼容性与性能更强 | GUI → Qt,逻辑层 → STL |
| 互操作 | 提供 toStdVector(), fromStdVector() 等函数 |
手动转换 | 与 STL 可互转 | 与 Qt 可互转 | 模块边界处灵活切换 |