QVector、Qlist、QlinkedList 类 用法比较:

 QVector、Qlist、QlinkedList 类 用法比较:   

         1. QVector 是提供动态数组的一个模板类。

             QList 是提供列表的一个模板类。

             QLinkedList 是提供链表的一个模板类。

         2. QVector<T> 是QT的一个通用容器类,它在相邻的内存位置中存储items的值,并且提供基于索引(index-based)的快速访问。

     QList<T> 是QT的一个通用容器类,它存储列表的值,并基于索引访问(index-based),同时,它插入和删除元素比较快(constant time)。

             QLinkedList<T> 是QT的一个通用容器类,它存储列表的值,并基于迭代器访问,同时,它插入和删除元素比较快(constant time)。

         3. QList<T>, QLinkedList<T>, QVector<T>and QVarLengthArray<T> 提供类似的功能,如下概况:

              ① 通常情况来说,QList是比较合适的选择,QList是基于索引访问(index-based)的API,它比QLinkedList {基于迭代器访问(iterator-based)的API}使用更加方便。

                  由于QList在内存中存储items的方式,它通常比QVector 更快(例如prepend()、insert()等)。而且,它只需更少的代码。

              ② 如果你需要使用一个真正的链表,并且保证使用迭代器(iterator)而不是索引(index)实现快速插入(constant time),可以使用QLinkedList。

              ③ 如果你需要items占据相邻内存空间,或者如果你的items比一个pointer更大并且你想要避免在插入时在堆上分配它们的话,可以使用QVector。

              ④ 如果你想要一个低级别的可变大小的数组,QVarLengthArray足矣。

 

 

QList和QVector等容器的区别

  1. 大多数情况下可以用QList。像prepend()insert()这种操作,通常QListQVector快的多。这是因为QList是基于index标签存储它的元素项在内存中,比那种依赖iterator迭代的更快捷。而且你的代码也更少。
  2. 如果你需要一个真正的连接着的list,且需要保证一个固定插入耗时。那就用迭代器,而不是标签。使用QLinkedList();
  3. 如果你需要开辟连续的内存空间存储,或者你的元素远比一个指针大,这时你需要避免个别插入操作,出现堆栈溢出,这时候用QVector
  4. 如果你需要一个低层的可变数量大小的数组,用QVarLengthArray就够了。他可以预先在栈中分配已知长度大小的数组,如果超过这个长度,会在堆中继续存储。默认大小256

QVarLengthArray<int, 1024> array(n + 1);

For most purposes, QList is the right class to use. Operations like prepend() and insert() are usually faster than with QVector because of the way QList stores its items in memory (see Algorithmic Complexity for details), and its index-based API is more convenient than QLinkedList's iterator-based API. It also expands to less code in your executable.

If you need a real linked list, with guarantees of constant time insertions in the middle of the list and iterators to items rather than indexes, use QLinkedList.

If you want the items to occupy adjacent memory positions, or if your items are larger than a pointer and you want to avoid the overhead of allocating them on the heap individually at insertion time, then use QVector.

If you want a low-level variable-size array, QVarLengthArray may be sufficient.

 

看qt的文档,只要是不要求数据所存放的内存是连续的,都建议用QList,因为QList的查询速度跟QVecotr是差不多的。感觉有点奇怪,至少与我之前所认识的List的查询是一不样的。好吧,看看源码的。
原来QList的元素的指针是通过数组来管理的,而不是用next的方式。每当插入或者删除一个元素时,QList就会更新这个指针数组。而查询的时候,QList只需要通过下标从此指针数组中找到元素的指针,再通过元素指针找到对应的元素即可。因此其查询复杂度跟QVector一样,也是常数的。只是每次查询比QVector多了一次指针寻址而已(当然QList[idx]的调用方式还会有些不同的)。
可见QList其实不仅仅是一个链表,可以说是一个数组与链表的结合体。

再说说QVecotr,就跟我们平时理解的一回事,就是维护一个数组了的类啦。

posted on 2020-08-15 10:35  莫水千流  阅读(2479)  评论(0编辑  收藏  举报