基础数据类型和数据结构

基础数据类型是编程语言中最基本的数据类型,通常由语言本身定义,并具有固定的大小和操作。常见的基础数据类型包括整数(如int、long)、浮点数(如float、double)、字符(如char)、布尔值(如bool)等。这些数据类型用于表示简单的数值、字符或真假值。

数据结构是一种组织和存储数据的方式,可以将多个数据元素按特定规则组织在一起,以便更有效地操作和管理数据。常见的数据结构包括数组、链表、栈、队列、树、图等。每种数据结构都具有不同的特性和适用场景,用于解决不同类型的问题。

基础数据类型用于存储单个数据元素的值,而数据结构则用于组织和管理多个数据元素的集合。数据结构可以基于基础数据类型进行扩展和组合,以创建更复杂的数据结构来满足实际需求。在编程中,了解基础数据类型和数据结构的概念和特性对于有效地处理和操作数据至关重要。

Qt的基础数据类型

Qt提供了以下基础数据类型:

  1. QString:用于表示Unicode字符串。
  2. QByteArray:用于表示字节数组,可用于处理二进制数据。
  3. QChar:用于表示单个Unicode字符。
  4. qreal:一种平台无关的浮点数类型,其精度可以是float或double,取决于编译器和目标平台。
  5. qint8、quint8、qint16、quint16、qint32、quint32、qint64、quint64:用于表示不同位数的整数类型,有符号和无符号两种。
  6. qreal和qint32可以用于QImage和QPixmap等图像处理。
  7. bool:表示布尔值,可以为true或false。
  8. int:表示整数类型。
  9. double:表示双精度浮点数。

这些基础数据类型在Qt中广泛使用,并且与Qt的其他类(如QStringList、QList、QVector等)一起构建了强大的应用程序框架。

Qt的数据结构

Qt提供了多种数据结构,用于在应用程序开发中组织和处理数据。以下是一些常用的数据结构:

  1. QList:动态数组,用于存储同一类型的元素列表。
  2. QVector:在性能上优化的动态数组,与QList相似但更适用于大型数据集。
  3. QMap:键值对的关联容器,根据键快速查找值。
  4. QHash:基于哈希表的关联容器,提供快速的键值对访问。
  5. QSet:无序集合,存储不重复的元素。
  6. QStringList:字符串列表,特定于QString的简单列表。
  7. QPair:表示两个值的有序对。
  8. QStack:堆栈,后进先出(LIFO)的数据结构。
  9. QQueue:队列,先进先出(FIFO)的数据结构。
  10. QLinkedList:双向链表,支持高效的插入和删除操作。

除了这些基本数据结构之外,Qt还提供了其他功能丰富的数据结构和容器类,如QVector3D和QMatrix4x4用于三维图形处理,以及QTreeWidgetItem和QTreeWidget用于树状结构的管理等。这些数据结构提供了灵活、高效的存储和操作数据的方式,可以满足各种应用程序开发需求。

数据结构使用中的问题

尽量使用接口

尽量使用接口而不是全局变量的方式对外提供数据。

使用接口替代全局变量有以下几个好处:

  1. 封装性和可维护性:通过接口,可以将复杂数据结构的实现细节隐藏起来,暴露出有限的接口方法供其他代码使用。这样可以提高代码的封装性,减少对数据结构内部的直接访问,降低耦合度,使代码更易于维护和修改。

  2. 代码重用:通过接口,可以将复杂数据结构的功能复用到不同的代码模块中。其他模块只需要通过接口的方法调用来操作和处理数据,而无需了解具体的实现细节。这样可以提高代码的可重用性,避免重复编写相似的逻辑。

  3. 可测试性:由于接口定义了一组明确定义的功能方法,可以很方便地对接口进行单元测试。测试时可以使用mock对象等方式替代真实的数据结构实现,精确控制测试环境,提高测试效率和可靠性。

  4. 扩展性和灵活性:如果今后需要对数据结构进行修改或者替换,只要保持接口的兼容性,其他代码可以基本保持不变。通过使用接口,可以实现对底层数据结构的隔离,使得业务代码与实际数据结构的耦合程度降低,将来进行扩展或者切换底层实现时更为方便。

总之,在设计和开发复杂数据结构时,使用接口来代替全局变量可以提供更好的封装性、可维护性、代码重用性和可测试性,同时也能提高系统的扩展性和灵活性。这样的设计风格符合面向对象编程的思想,并且有助于构建高质量、易于理解和维护的代码。

容器内容的修改

先将内容存入局部容器,再将全局容器变量指向局部容器。使用局部容器进行赋值而不是插入修改Qt容器的内容有以下好处:

  1. 迭代器的有效性:直接对原容器进行修改,可能会导致迭代器失效。而使用局部容器进行赋值操作,可以避免这个问题,保证迭代器的有效性,确保代码逻辑的正确性。

  2. 提高效率:插入操作涉及内存分配和数据移动的开销,而局部容器赋值只需要进行一次内存拷贝,相对更为高效。特别是当容器中的元素较多时,使用局部容器赋值可以减少不必要的开销。

  3. 事务性操作:使用局部容器赋值可以将修改操作组织为一个事务,一次性地应用于目标容器。这样可以确保修改操作的原子性,使得容器在修改过程中保持一致性,减少错误的可能性。

  4. 更好的控制和管理:通过使用局部容器进行赋值,可以更方便地控制和管理每次修改操作。可以在局部容器上执行各种操作,验证其正确性,最后将整个局部容器的内容赋值给目标容器,保证整个修改行为的一致性和完整性。

  5. 值的正确性:可以指向一个新的地址,从而使该容器不会残留上一次的值。

总结起来,使用局部容器进行赋值而不是直接插入修改Qt容器的内容可以提高程序的稳定性和效率,避免迭代器失效问题,提供更好的控制和管理修改操作,并保持容器的一致性。

注意隐式共享机制

这个之前写过了,不再重复。

qt多线程下,QString赋值导致崩溃_zw_ggr_2017的博客-CSDN博客

06-22 09:20