QTL 详解一

一、容器类型

顺序容器:QListQLinkedListQVectorQStack 和 QQueue

关联容器:QMapQMultiMapQHashQMultiHash 和 QSet

还有两个特殊的容器 QCache、QContiguousCache。

区别在于:关联容器是通过键(key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。

1非节点式(连续内存);Qvector,QQueue, QStack 

2节点式(非连续内存):Qmap,Qset,Qlist,QHash、QlinkedList、QMultiMapQMultiHash 

二、顺序容器

QListQLinkedListQVectorQStack 和 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。

三、关联容器

QMapQMultiMapQHashQMultiHash 和 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。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值