QT容器差别和选择策略
容器类:
QList类是一个提供列表的模板类。
QList是Qt的通用容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问和基于索引的插入和删除。
QVector类是一个提供动态数组的模板类。
QVector是Qt的通用容器类之一。它将其项存储在相邻的内存位置,并提供基于索引的快速访问。
QLinkedList类是一个提供链接列表的模板类。
QLinkedList是Qt的通用容器类之一。它存储一个值列表,并提供基于迭代器的访问以及恒定时间的插入和删除。
QVector应该是默认的首选。
QVector通常会比QList提供更好的性能,因为QVector总是在内存中顺序存储其项,而QList将在堆上分配其项。
QVector实现的是一个数组,通过下标,拥有极快的访问速度。但是在插入删除上会根据实际情况消耗时间。
QList实现的是一个数组-链表结构(数组是索引index,链表是数据),所以QList的算法基于索引实现,支持方便的插入删除操作。
QLinkedList 则是一个真正的链表,它可以保证在中间列表中插入恒定的时间,并使用迭代器对项目而不是索引进行迭代器。
根据基本容器的性能,选取策略为:
需要存储一些背景数据,数据尺寸一般不会变化,然后经常需要查询,则使用QVector;
存储中间变量,适用于不同层次的接口,作为参数等,需要经常被构造,增加、删除元素等操作,则使用QList;
经常需要对容器进行大尺度的长度变化,使用QLinkedList;
//其他特定容器:
QQueue类是一个提供队列的通用容器。
QQueue是Qt的通用容器类之一。它为相同类型的项目实现了队列数据结构。队列是先进先出(FIFO)结构。
QStack类是一个提供堆栈的模板类。
QStack是Qt的通用容器类之一。它为相同类型的项实现堆栈数据结构。堆栈是后进先出(LIFO)结构。
QSet 类是一个模板类,提供基于哈希表的集合。
QSet是Qt的通用容器类之一。它以未指定的顺序存储值,并提供非常快速的值查找。
QSet不允许有重复的值,QSet由于通过Hash实现,没有顺序,只能通过迭代器遍历
特定容器有很明显的特征,当实际需求满足特征的时候,就可以选择。
关联容器类:
QHash类是一个模板类,提供基于哈希表的字典。
QHash<Key,T>是Qt的通用容器类之一。它存储(键、值)对,并提供与键关联的值的快速查找。
QMap类是一个模板类,它提供了一个基于红黑树的字典。
QMap<Key,T>是Qt的通用容器类之一。它存储(键、值)对,并提供与键关联的值的快速查找。
QHash提供了比QMap更快的查找速度。
在QMap上迭代时,项目总是按键排序。使用QHash,项目可以任意排序。
根据不同的属性,选取策略为:
由于QHash更快,那么能使用QHash就不适用QMap;
由于QHash是无序表,所以根据实际情况,如果需要顺序,则使用QMap,不需要则使用QHash
//其他特定关联容器:
QMultiMap类是一个方便的QMap子类,提供多值映射。
QMultiMap<Key,T>是Qt的通用容器类之一。它继承了QMap,并通过几个方便的函数对其进行了扩展,
使其比QMap更适合存储多值映射。多值映射是允许多个值具有同一密钥的映射;QMap通常不允许这样做,除非调用QMap::insertMulti()。
QMultiHash类是一个方便的QHash子类,提供多值哈希。
QMultiHash<Key,T>是Qt的通用容器类之一。它继承了QHash,并通过几个方便的函数对其进行了扩展,
使其比QHash更适合存储多值散列。多值散列是允许使用同一密钥的多个值的散列;QHash通常不允许这样做,除非调用QHash::insertMulti()。
特定容器有很明显的特征,当实际需求满足特征的时候,就可以选择。