qt-C++笔记之QStringList、QList、QVector、QString、QChar、QList区别

—— 2024-01-30 凌晨0:27


请添加图片描述

参考博文:qt-C++笔记之QStringList

code review!

1.Qt的字符容器类

在这里插入图片描述

—— 《Qt程序设计基础 基于银河麒麟桌面操作系统》

1.QString和 QList的区别

QStringQList<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的区别

QStringListQList<QString> 都是 Qt 框架中用于处理字符串列表的类,但它们之间有一些细微的区别:

QStringList

  • QStringListQList<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

  • 定义: QStringListQList<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 相同。
  • 适用场景:
    • 当存储对象类型为 QString 时,QStringList 更适用。
    • 适合在 Qt 4 和 Qt 5 中存储其他类型的对象。
  • Qt 版本演化:
    • 在 Qt 6 中,QListQVector 的实现合并,建议使用 QVector 替代 QList

3.3.QVector

  • 定义: QVector 是一个基于连续内存的动态数组容器。
  • 特点:
    • QList 更适合存储小对象(例如 QString)。
    • 更接近于标准库的 std::vector
  • 性能:
    • 由于基于连续内存,支持快速的随机访问。
    • 在 Qt 6 中,QVectorQList 合并,性能一致。
  • 适用场景:
    • 适合需要高效随机访问和存储小对象的场景。
    • 在 Qt 6 中被推荐为首选容器。
  • Qt 版本演化:
    • 从 Qt 4 开始推荐使用。
    • Qt 6 后,QListQVector 合并,进一步增强了 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 中,QVectorQList 合并,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 的框架中,QStringListQList<QString> 的 类型别名(typedef),并非派生类。随着 Qt 版本的演变,QStringList 的实现和推荐使用方式受到了 QListQVector 设计变化的影响。以下是 QStringList 的详细说明及其与 Qt 版本演变的关系。

4.1.QStringList 的定义与特点

1.定义
在 Qt 的源码中,QStringList 被定义为 QList<QString> 的类型别名:

typedef QList<QString> QStringList;

因此,QStringListQList<QString> 在底层实现上是完全相同的。但是,QStringList 提供了许多专门用于操作字符串的扩展功能,使其在处理字符串列表时更加高效和便捷。

2.特点

  • 类型别名:不是派生类,只是 QList<QString> 的一种特化。
  • 扩展功能:QStringList 增加了一些字符串操作的方法(例如 join()filter()replaceInStrings() 等),这些功能在 QList<QString> 中不存在。
  • 语义化:在代码中使用 QStringList 表示 “字符串列表” 更加直观,语义清晰。

4.2.QStringList 在不同 Qt 版本中的演变

随着 Qt 的版本迭代,QStringList 的使用和实现方式受到 QListQVector 设计变化的影响。以下是其在不同 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 中,QListQVector 的实现被合并。这意味着:

    • QListQVector 在底层实现上完全一致,性能差异消失。
    • 官方推荐直接使用 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 的实现:
    QStringListQList<QString> 的 类型别名,并非派生类。它提供了一些字符串操作的扩展功能,适合处理字符串列表。

  • 与 Qt 版本演变的关系:

    • 在 Qt 4 和 Qt 5 中,QStringList 的底层实现依赖 QList,性能与 QList<QString> 相同。
    • 在 Qt 6 中,由于 QListQVector 的合并,QStringList 的底层实现也变为基于 QVector,性能得到优化。
    • 尽管如此,Qt 官方更推荐使用 QVector,但 QStringList 仍然可用,特别是对于需要语义化和字符串操作的场景。
  • 实际建议:
    如果明确需要操作字符串列表,使用 QStringList,因为它提供了专门的字符串方法;在其他场景中,优先考虑 QVector

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐