Qt容器类

文章目录

  • 一、顺序容器
    • QVector
    • QList
    • QLinkedList
    • QStack
    • QQueue
  • 二、关联容器类
    • QMap
    • QMultiMap
    • QHash
    • QMultiHash
    • QSet
    • QCache与QContiguousCache
  • 三、容器的嵌套
  • 四、Object及其子类不能直接作为容器类的item
  • C++容器类和Qt容器类的对比

Qt中的容器类比STL(C++标准模版库)更轻量、更安全、更容易使用。

一、顺序容器

顺序容器中的数据项(item)在逻辑上是一个接一个线性存储的;
Qt顺序容器都支持面向对象的泛型操作。

QVector

QVector可以容纳指定类型的数据(QVector支持自定义类型,但纯数组只支持基本数据类型,不支持自定义类型);
QVector作用相当于面向对象的动态数组(大小可变);
QVector的每个item在内存中是连续存储的;
当在QVector的中间或前端插入新item时,后面的item依次向后移动一个位置,所以QVector的中间与前端插入操作较慢。

QList

QList是使用最多、最好用的顺序容器,能够满足大多数程序的需求;
QList是一个数组列表,可以快速地在头、尾进行添加操作;
当item的总个数在1000个以内时,可以实现在QList中间进行快速的插入操作;
QList支持使用[索引]进行直接访问一个item;
QList常用的算法有:判断是否为空isEmpty()、获取item的个数size()、前插prepend()、后插append()、指定位置插入inset()、替换replace()、交换swap()、移动move()、移除首个removeFirst()、移除最后一个removeLast()、移除指定位置的item removeAt()、移除(并不删除对象)并获取首个takeAt()、移除(并不删除对象)并获取最后一个takeLast()、移除(并不删除对象)指定位置的item takeAt()、获取一个item的索引indexOf()、判断是否含有item contains()、获取一个item出现的次数count()、连续插入item<<、快速只读访问item at()等。
QStringList是QList的子类。

QLinkedList

QLinkedList是一个链表,当item个数很多时,QLiskedList的中间插入操作比QList快;
QLinkedList不支持[索引]操作,但可以很好地支持迭代器
(当进行插入、删除操作后,指向QLinkedList的一个存在的item的迭代器仍然有效,同情况下QList的迭代器则会失效)。

QStack

QStack是QVector的一个子类,支持后进先出(LIFO);
QStack增加的方法有:入栈push()、出栈pop()、获取栈顶item top()等。

QQueue

QQueue是QList的一个子类,支持先进先出(FIFO);
QQueue增加的方法有:入队enqueue()、出队dequeue()、获取队首item head()等。

二、关联容器类

关联容器是通过键值对(Key-Value)进行存储与管理数据的。

QMap

QMap会将Key类型的键值映射到T类型的值上,形成一个关联对数据;
QMap的一个Key只关联一个T值;
QMap是按Key的顺序进行存储的;
QMap常用方法有:
获取值value()、判断是否包含键contains()、删除一个键并获取该键对应的值take()、插入insert()、删除一个键remove()、清空clear()、插入一键多值(这时相当于子类QMultiMap)insertMulti()等;
QMap还支持[索引]插入/获取一个键的值(当使用[索引]操作不存在的键的值时,会默认向QMap中插入该键);
使用value()获取一个键的值时,如果指定的键不存在,会默认返回0(可以通过参数指定默认返回值);

QMultiMap

QMultiMap是QMap的一个子类,它支持一键多值存储;
QMultiMap不支持[索引]操作;
QMultiMap增加的操作方法有:
获取最新插入的键对应的单个值value()、获取一个键的所有值values()、QMultiMap::replace()等效于QMap::insert()。

QHash

QHash拥有QMap相同的接口;
QHash的数据是按照任意顺序存储的,所以QHash的查找速度更快。

QMultiHash

QMultiHash是QHash的一个子类,它支持一键多值存储。

QSet

QSet是T类型的数据集合,支持快速查询。
QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能。
QSet的数据必须是一个可转化的数据类型(assignable data type),举个例子,不能存QWidget而要存QWidget*。

QCache与QContiguousCache

QCache与QContiguousCache提供了对缓存在存储中的对象的高效散列查找。

三、容器的嵌套

容器类支持嵌套,例如:
QMap就是以Key类型对象键,以QList为值;
注意:两个>之间必须有一个空格,否则编译器会误认为是>>操作符。

四、Object及其子类不能直接作为容器类的item

即:QWidget、QDialog、QTimer等不能作为容器类的item,但它们的指针可以,如:QList是合法的。

C++容器类和Qt容器类的对比

C++中容器类是属于标准模板库中的内容,STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。
在C++标准中,STL被组织为下面的13个头文件:
、、、、、、、、、、、和。
Qt容器类的好处在于,它提供了平台无关的行为,以及隐式数据共享技术。Qt支持两种风格的迭代器——Java-style和STL-style,Java-style的迭代器更容易使用,而STL-style的迭代器可以同Qt和STL中的算法联合使用,更为强大。

你可能感兴趣的:(QT,qt,容器类,QVector,QList)