Qt常用容器类
Qt为我们提供了一系列基于模板的容器类,来存储特定类型的项。这些容器类都是隐式共享的;被用作只读容器时,是线程安全的。
与STL类似,也分为序列式容器和关联式容器。
序列式容器有:QVector、QList、QLinkList、QStack、QQueue。对大部分程序来说QList都是一个很好的选择,快速添加操作;如果你想要确保元素占用连续内存,可以用QVector;而QStack和QQueue分别提供了LIFO和FIFO操作。
关联式容器有:QMap、QMultiMap、QHash、QMultiHash、QSet。这些容器存储为Key-Value对,Multi表示支持一个Key关联多个Value;Hash容器通过hash函数而不是二分法查找,提供了更快速的查找操作;
(1)QVector
(2)QList
- 当元素占内存 <= 指针占内存时,且元素使用Q_DECLARE_TYPEINFO声明为Q_MOVABLE_TYPE或Q_PRIMITIVE_TYPE时,那么QList存储方式和QVector一样,都是数组形式;
- 当元素占内存 >指针占内存时,那么QList会把每一个元素new到堆上;
PS:Q_DECLARE_TYPEINFO(Type, Flags):可以使用此宏指定有关自定义类型的信息。有了准确的类型信息,Qt的通用容器可以选择合适的存储方法和算法。类型如下:
Q_PRIMITIVE_TYPE指定该类型是一个POD(纯旧数据)类型,没有构造函数或析构函数,或者是一个类型,其中每个位模式都是有效的对象,memcpy()创建该对象的有效独立副本;
Q_MOVABLE_TYPE指定该类型具有构造函数和/或析构函数,但可以使用memcpy()在内存中移动。注意:尽管有名称,但这与移动构造函数或C++移动语义无关;
Q_COMPLEX_TYPE(默认值)指定该类型具有构造函数和/或析构函数,并且不能在内存中移动它;
PS:当数据量比较小时(小于1000项),QVector和QList没区别;当需要开辟连续空间,或元素远比指针占内存大时,用QVector;当追加元素时,QVector大概快百分之5;当经常查找、按索引获取元素时,QList比较快;
(3)QLinkedList
(4)QStack
(5)QQueue
(6)QSet
(7)QMap
(8)QMultiMap
(9)QHash
(10)QMultiHash
PS:这些容器中存储的值可以是任何能被赋值的数据类型,即该类型必须提供一个默认的构造函数、一个拷贝构造函数、一个赋值运算符。这样的数据类型涵盖了大部分你可以存储的类型,包括基本类型int和double,指针类型,Qt的数据类型QString,QDate,QTime,但不包括QObject或其子类(QWidget,QDialog,QTimer等等)。如果你尝试构建一个QList
转载链接:(10条消息) QList 和 QVector 的区别,和使用注意事项_VectorAL的博客-CSDN博客_qvector和qlist 一般用哪个