qt-C++笔记之QStringList、QList<QString>、QVector<QString>、QString、QChar、QList<QChar>区别
— 2024-01-30 凌晨0:27。
qt-C++笔记之QStringList、QList、QVector、QString、QChar、QList区别
—— 2024-01-30 凌晨0:27
参考博文:qt-C++笔记之QStringList
code review!
文章目录
1.Qt的字符容器类

—— 《Qt程序设计基础 基于银河麒麟桌面操作系统》
1.QString和 QList的区别
QString 和 QList<QChar> 是 Qt 中的两个不同的类,它们代表了不同的概念和用途:
QString
QString是一个高级的字符串处理类,专门用于处理和表示文本。- 它内部使用 Unicode 编码,因此可以容易地处理国际化文本。
QString提供了大量的字符串相关操作,如拼接、分割、搜索、替换、编解码等。- 它是隐式共享的,这意味着当你拷贝一个
QString对象时,实际上并不会立即复制数据,只有在需要修改时才会进行复制(写时复制)。 QString对象是连续存储的,提供了快速的索引访问和高效的内存使用。
QList
QList<QChar>是一个容器类,用于存储QChar对象的列表。QList是一个模板类,可以用来存储任何类型的元素,QList<QChar>特指存储QChar的列表。- 与
QString不同,QList<QChar>不提供专门的字符串处理功能,它只是一个通用的列表容器。 - 在
QList<QChar>中,字符是单独存储的,每个QChar是列表中的一个元素。 - 使用
QList<QChar>来处理字符串是低效的,因为它不是为字符串操作优化的,且没有QString提供的便捷操作。
总的来说,如果你需要处理文本数据,QString 是更合适的选择,因为它为此提供了大量的方法。而 QList<QChar> 通常用于特定情况,比如当你需要存储字符的集合,并且不需要字符串操作功能时。大多数情况下,推荐使用 QString 来处理和存储文本数据,因为它的设计目的就是简化和优化这些任务。
2.QStringList 和QList的区别
QStringList 和 QList<QString> 都是 Qt 框架中用于处理字符串列表的类,但它们之间有一些细微的区别:
QStringList
QStringList是QList<QString>的一个子类,专门用于处理字符串列表。- 它提供了一些特定于字符串处理的额外便利方法,如对字符串列表进行排序、过滤、查找等操作。
QStringList可以直接与 Qt 的其他部分(如 GUI 控件)交互,它有一些特化的方法使得和这些组件的集成更加方便。- 例如,
QStringList有一个方便的join()方法,用于将列表中的所有字符串连接成一个单独的QString,以及filter()方法,用于根据指定条件过滤字符串列表。
QList
QList<QString>是一个通用容器,可以存储任何类型的元素,在这种情况下,它被用于存储QString对象。- 它没有
QStringList提供的特化字符串处理方法。 - 当你不需要
QStringList提供的特殊字符串处理功能时,可以使用QList<QString>。
在实际应用中,当你的工作仅涉及到字符串集合,并且需要进行字符串特有的操作时,使用 QStringList 是更方便的。如果你正在处理一个更通用的对象集合(即使它恰好是字符串),或者你不需要 QStringList 提供的专门功能,那么使用 QList<QString> 就足够了。在 Qt5 中,QStringList 是非常常见的,但在 Qt6 中,QStringList 已经不是 QList<QString> 的子类了,而是类型别名 QList<QString>。所以,这个区别在 Qt6 中不再适用。
3.2024-11-30日笔记一:QStringList、QList<QString>、QVector<QString>的区别与Qt版本的演变
3.1.QStringList
- 定义:
QStringList是QList<QString>的一个特化版本,专门用于存储字符串。 - 特点:
- 提供了许多与字符串相关的特定功能(如
join()和split())。 - 在使用字符串列表时,更简洁、更语义化。
- 提供了许多与字符串相关的特定功能(如
- 性能:
- 与
QList<QString>相同,因为它是QList<QString>的派生类型。
- 与
- 适用场景:
- 如果容器明确只存储字符串,应优先使用
QStringList,代码更清晰。
- 如果容器明确只存储字符串,应优先使用
- Qt 版本演化:
- 从早期 Qt 4 开始就存在,功能基本稳定。
- 在 Qt 6 及以后,Qt 开始推荐使用
QVector,但仍保留了兼容性。
3.2.QList
- 定义:
QList是 Qt 通用列表容器,用于存储任意类型的对象。 - 特点:
- 支持存储值类型和指针类型。
- 提供多种操作方法,如插入、删除、排序等。
- 性能:
- 早期(Qt 4 和 Qt 5)
QList使用隐式共享设计,存储小对象时可能有性能开销。 - 在 Qt 6 中,
QList的实现被调整,与QVector合并,性能与QVector相同。
- 早期(Qt 4 和 Qt 5)
- 适用场景:
- 当存储对象类型为
QString时,QStringList更适用。 - 适合在 Qt 4 和 Qt 5 中存储其他类型的对象。
- 当存储对象类型为
- Qt 版本演化:
- 在 Qt 6 中,
QList和QVector的实现合并,建议使用QVector替代QList。
- 在 Qt 6 中,
3.3.QVector
- 定义:
QVector是一个基于连续内存的动态数组容器。 - 特点:
- 比
QList更适合存储小对象(例如QString)。 - 更接近于标准库的
std::vector。
- 比
- 性能:
- 由于基于连续内存,支持快速的随机访问。
- 在 Qt 6 中,
QVector和QList合并,性能一致。
- 适用场景:
- 适合需要高效随机访问和存储小对象的场景。
- 在 Qt 6 中被推荐为首选容器。
- Qt 版本演化:
- 从 Qt 4 开始推荐使用。
- Qt 6 后,
QList和QVector合并,进一步增强了QVector的地位。
3.4.Qt 版本演化的联系
| Qt 版本 | QStringList | QList | QVector |
|---|---|---|---|
| Qt 4 | 提供字符串特化类,推荐用于字符串操作。 | 通用容器,广泛使用,但对小对象性能不如 QVector。 |
推荐用于存储小对象,性能更优。 |
| Qt 5 | 功能稳定,仍是推荐的字符串容器。 | 仍然广泛使用,但性能劣势逐渐显现。 | 在存储小对象时表现更优,逐步成为趋势。 |
| Qt 6 | 保留兼容性,但推荐使用 QVector。 |
内部实现与 QVector 合并,不再推荐使用。 |
成为首选容器,推荐替代 QList。 |
3.5.总结
- 如果是字符串操作,
QStringList更语义化。 - 对于小对象的存储和高效随机访问,Qt 6 下推荐使用
QVector。 - 在 Qt 6 中,
QVector和QList合并,QVector成为首选容器。
以下是总结表格:
| 容器类型 | 特点 | 适用场景 | 性能 | Qt 版本推荐 |
|---|---|---|---|---|
| QStringList | 字符串特化类,提供字符串相关操作方法。 | 操作字符串列表时推荐,代码更清晰。 | 与 QList<QString> 性能相同。 |
所有版本均推荐。 |
| QList | 通用容器,存储任意类型对象。 | 存储其他类型数据时使用,Qt 6 后不再推荐。 | Qt 6 前性能略逊于 QVector。 |
Qt 4 和 Qt 5 推荐。 |
| QVector | 基于连续内存,适合小对象和快速随机访问。 | 高效存储小对象,Qt 6 后推荐替代 QList。 |
性能优于 QList(Qt 6 前)。 |
Qt 6 后首选推荐。 |
4.2024-11-30日笔记二:QStringList、QList<QString>、QVector<QString>的区别与Qt版本的演变
在 Qt 的框架中,QStringList 是 QList<QString> 的 类型别名(typedef),并非派生类。随着 Qt 版本的演变,QStringList 的实现和推荐使用方式受到了 QList 和 QVector 设计变化的影响。以下是 QStringList 的详细说明及其与 Qt 版本演变的关系。
4.1.QStringList 的定义与特点
1.定义
在 Qt 的源码中,QStringList 被定义为 QList<QString> 的类型别名:
typedef QList<QString> QStringList;
因此,QStringList 和 QList<QString> 在底层实现上是完全相同的。但是,QStringList 提供了许多专门用于操作字符串的扩展功能,使其在处理字符串列表时更加高效和便捷。
2.特点
- 类型别名:不是派生类,只是
QList<QString>的一种特化。 - 扩展功能:
QStringList增加了一些字符串操作的方法(例如join()、filter()、replaceInStrings()等),这些功能在QList<QString>中不存在。 - 语义化:在代码中使用
QStringList表示 “字符串列表” 更加直观,语义清晰。
4.2.QStringList 在不同 Qt 版本中的演变
随着 Qt 的版本迭代,QStringList 的使用和实现方式受到 QList 和 QVector 设计变化的影响。以下是其在不同 Qt 版本中的相关演变:
4.2.1.Qt 4(初始阶段)
-
QStringList 的引入
QStringList从 Qt 3 开始就存在,在 Qt 4 中,它被定义为QList<QString>的类型别名,底层实现依赖于QList。 -
QList 的特点
QList在 Qt 4 中是一个通用的容器,设计为存储对象的指针或小型对象(如QString)。- 通过隐式共享(Copy-on-Write, COW)优化了数据的拷贝操作。
- 适用于存储各种类型的对象,但对于小型对象的性能不如
QVector。
-
推荐使用场景
在 Qt 4 中,QStringList是处理字符串列表的最佳选择,其性能与QList<QString>相同,但更语义化,适合开发者明确表示 “字符串列表” 的需求。
4.2.2.Qt 5(过渡阶段)
-
QList 的局限性逐渐显现
到了 Qt 5,QList的设计开始受到批评,原因如下:QList的实现在某些情况下不如QVector高效,特别是存储小对象时。- 对于小型对象(如
QString),QList的内存布局更加复杂,性能劣于基于连续内存的QVector。
-
QStringList 的稳定性
尽管如此,QStringList的使用方式和功能在 Qt 5 中保持不变,仍然是处理字符串列表的推荐方式。 -
性能建议
Qt 官方在 Qt 5 中开始建议在需要高效存储小对象时优先使用QVector,这也间接影响了QStringList的使用场景。
4.2.3.Qt 6(重大变革阶段)
-
QList 和 QVector 的合并
在 Qt 6 中,QList和QVector的实现被合并。这意味着:QList和QVector在底层实现上完全一致,性能差异消失。- 官方推荐直接使用
QVector,因为它的语义更贴近现代 C++(类似于标准库的std::vector)。
-
QStringList 的地位
QStringList的定义保持不变,仍然是QList<QString>的类型别名。- 尽管
QStringList的性能与QList<QString>(即QVector<QString>)一致,但 Qt 官方更倾向于推荐使用QVector,以统一容器的使用方式。 QStringList仍然保留,因为它的语义化和字符串操作功能在实际开发中非常实用,特别是对于需要处理字符串集合的场景。
4.3.QStringList 的特有功能
以下是 QStringList 提供的部分扩展功能,这些方法在 QList<QString> 中不存在:
| 方法 | 功能 | 示例 |
|---|---|---|
join(const QString &separator) |
将字符串列表中的元素用指定分隔符连接成一个字符串。 | list.join(", ") → "apple, banana, cherry" |
filter(const QString &pattern) |
返回与指定模式匹配的字符串列表。 | list.filter("ap") → {"apple", "apricot"} |
replaceInStrings(const QString &before, const QString &after) |
将列表中每个字符串的指定子串替换为另一个子串。 | list.replaceInStrings("a", "A") → {"Apple", "bAnAnA", "cherry"} |
toSet() |
将字符串列表转换为 QSet<QString>。 |
list.toSet() → { "apple", "banana", "cherry" } |
4.4.QStringList 与 Qt 版本的适配性对比
以下是 QStringList 在不同 Qt 版本中的适配性和推荐程度:
| Qt 版本 | QStringList 的实现 | 推荐程度 | 注意事项 |
|---|---|---|---|
| Qt 4 | 类型别名,基于 QList<QString>,依赖隐式共享。 |
推荐,处理字符串列表的最佳选择。 | QList 对小型对象(如 QString)性能略逊于 QVector。 |
| Qt 5 | 类型别名,功能保持稳定。 | 推荐,语义化强,功能丰富。 | 适用于字符串操作,但官方逐渐推荐使用 QVector 存储小型对象。 |
| Qt 6 | 类型别名,底层实现与 QVector 一致。 |
推荐,但官方更倾向直接使用 QVector。 |
性能与 QVector 相同,但仍然保留,适合需要语义化和字符串操作的场景。 |
4.5.总结
-
QStringList 的实现:
QStringList是QList<QString>的 类型别名,并非派生类。它提供了一些字符串操作的扩展功能,适合处理字符串列表。 -
与 Qt 版本演变的关系:
- 在 Qt 4 和 Qt 5 中,
QStringList的底层实现依赖QList,性能与QList<QString>相同。 - 在 Qt 6 中,由于
QList和QVector的合并,QStringList的底层实现也变为基于QVector,性能得到优化。 - 尽管如此,Qt 官方更推荐使用
QVector,但QStringList仍然可用,特别是对于需要语义化和字符串操作的场景。
- 在 Qt 4 和 Qt 5 中,
-
实际建议:
如果明确需要操作字符串列表,使用QStringList,因为它提供了专门的字符串方法;在其他场景中,优先考虑QVector。
更多推荐


所有评论(0)