一、容器类型
顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue
关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet
还有两个特殊的容器 QCache、QContiguousCache。
区别在于:关联容器是通过键(key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
1非节点式(连续内存);Qvector,QQueue, QStack
2节点式(非连续内存):Qmap,Qset,Qlist,QHash、QlinkedList、QMultiMap、QMultiHash
二、顺序容器
QList,QLinkedList,QVector,QStack 和 QQueue
1、QList
QList是最常用的容器类,虽然它是以数组列表( aray-list)的形式实现的,在其前或后或中间添加删除数据非常快,内存随机存取不连续, 查询效率比Qvector慢。QList 以下标索引的方式对数据项进行访问。
QList用于添加、插入、替换、移动、删除数据项的函数有: insert()、 replace()、 removeAt()、move()、swap(、 append()、 prepend()、 removeFirst()和 removeLast()等。
QList的isEmptyO函数在数据项为空时返回true, size()函 数返回数据项的个数。
2、QLinkedList
QLinkedList<T>是链式列表(linked-list), 数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。
除了不提供基于下标索引的数据项访问外,QLinkedList 的其他接口函数与QList基本相同。
3、QVector
QVector<T>提供动态数组的功能,以下标索引访问数据。
QVector的函数接口与QList 几乎完全相同,QVector<T> 的性能比QList<T>更高, 因为QVector<T>的数据项是内存连续存储的,查询效率高,但是中间插入删除慢。
4、Qstack
QStack<T>是提供类似于堆栈的后入先出LIFO) 操作的容器类,push()和pop()是主要的接口函数,是QVector子类(连续内存)。例如:
QStack<int> stack;
stack.push(10) ;
stack.push(20) ;
stack.push(30) ;
while (!stack. isEmpty())
cout << stack.pop() << endl ;
程序会依次输出30,20,10。
5、QQueue
QQueue<T>是提供类似于队列先入先出(FIFO) 操作的容器类。enqueue()和 dequeue()是主要操作函数,是QVector子类(连续内存)。例如:
QQueue<int> queue;
queue . enqueue (10) ;
queue . enqueue (20) :
queue . enqueue (30) ;
while (!queue . isEmpty()) .
cout << queue.dequeue() << endl;
程序会依次输出10, 20, 30。
三、关联容器
QMap,QMultiMap,QHash,QMultiHash 和 QSet
1、QSet
QSet是基于散列表的几何模板类,它存储数据的顺序是不定的 ,查找值得速度非常快。QSet<T>内部就是用QHash实现的。
一个单值的数学集合的快速查找容器,使用方式与QList相同,但其内元素不会有重复。
注意,此容器实现方式是基于哈希表。
2、Qmap
QMap<Key, T>提供-一个字典(关联数组),-一个键映射到-一个值。QMap 存储数据是按照键的顺序,如果不在乎存储顺序,使用QHash会更快。
3、QMultiMap
QMultiMap是QMap的子类,是用于处理多值映射的便利类。多值映射就是一个键可以对应多个值,QMap正常情况下不允许多值映射,除非使用Map:insertMulti0)添加键值对。
QMultiMap是QMap的子类,所以QMap的大多数函数在QMultiMap都是可用的,但是有几个特殊的,QMultiMap:insert()等效于QMap:insertMulti(),QMultiMap::replace()等效于QMap:insert()。
4、QHash
QHash是基于散列表来实现字典功能的模板类,QHash<Key, T>存储的键值对具有非常快的查找速度。
QHash与QMap的功能和用法相似,区别在于以下几点:
●QHash 比QMap的查找速度快;
●在QMap. 上遍历时,数据项是按照键排序的,而QHash的数据项是任意顺序的:
●QMap 的键必须提供“<”运算符,QHash的键必须提供“==”运算符和-一个名称为qHashO)的全局散列函数。
5、QMultiHash
QMultiHash是QHash的子类,是用于处理多值映射的便利类,其用法与QMultiMap类似。
四、QTL与C++容器STL比较
- QLinkedList —— std::list 两者都是双向链表,两者可以直接互转。
- QVector —— std::vector 两者都是动态数组,都是根据sizeof(T)进行连续分配,保证成员内存连续,能够用data()直接取出指针作为c数组使用,两者可以直接互转。
- QMap —— std::map 两者都是红黑树算法,但不能互转,因为数据成员实现方式不同。std::map的数据成员用的是std::pair,而QMap用的是自己封装的Node,当然还是键值对.
- QMultiMap —— std::multimap 同上。
- QList —— 暂无。QList其实不是链表,是优化过的vector,官方的形容是array list。它的存储方式是分配连续的node,每个node的数据成员不大于一个指针大小,所以对于int、char等基础类型,它是直接存储,对于Class、Struct等类型,它是存储对象指针。std::deque很相似,但有少许区别。据有的知友提出,QList更像是boost::deque。