Qt容器类汇总说明
本文标题:Qt容器类汇总说明 本文地址:http://techieliang.com/2017/12/542/
下述说明来源于官方文档
1. 介绍
Qt库提供了一组通用的基于模板的容器类。这些类可用于存储指定类型的项。例如,如果你需要一个可调整大小的数组qstrings,使用QVector <QString>。
这些容器类的设计要比STL容器更轻、更安全、更容易使用。如果您不熟悉STL,或者更喜欢做“qt方式”,您可以使用这些类而不是STL类。
Qt还提供了一个foreach关键字,让它来遍历所有的物品存放在一个容器很容易。
qt提供的foreach在c++标准中并没有,在c++11中提供了类似于for(auto t:container)方式遍历容器,此方式qt也支持,个人感觉使用for更好
……更多介绍看官网
2. 本博客的Qt容器使用说明
QMap、QMultiMap、(当前内容截止此随笔发布日,后续内容请见博客后续更新 本文地址:http://techieliang.com/2017/12/542/)
3. 容器类
Qt提供了下列顺序容器:QList,QLinkedList,QVector,QStack,和QQueue。对于大多数应用程序,QList是使用最好的类型。虽然它底层用数组链表实现,但提供了非常快速的前后追加函数。如果你真的需要一个链表,用QLinkedList;如果你想让你的项目占用连续的内存位置,使用QVector。QStack 和QQueue提供了先进先出(LIFO ),先结后出(FIFO )。
Qt也提供了关联式容器:?QMap,?QMultiMap,?QHash,?QMultiHash,和QSet.?。Multi容器支持多个value关联到单一的key。Hash容器提供了通过hash函数快速查找取代二分查找。
特殊情况下,?QCache?和?QContiguousCache?提供了在有限的cache?中高效的查找对象。
Class | Summary |
---|---|
QList<T> | This is by far the most commonly used container class. It stores a list of values of a given type (T) that can be accessed by index. Internally, the QList is implemented using an array, ensuring that index-based access is very fast.Items can be added at either end of the list using QList::append() and QList::prepend(), or they can be inserted in the middle using QList::insert(). More than any other container class, QList is highly optimized to expand to as little code as possible in the executable. QStringList inherits from QList<QString>. |
QLinkedList<T> | This is similar to QList, except that it uses iterators rather than integer indexes to access items. It also provides better performance than QList when inserting in the middle of a huge list, and it has nicer iterator semantics. (Iterators pointing to an item in a QLinkedList remain valid as long as the item exists, whereas iterators to a QList can become invalid after any insertion or removal.) |
QVector<T> | This stores an array of values of a given type at adjacent positions in memory. Inserting at the front or in the middle of a vector can be quite slow, because it can lead to large numbers of items having to be moved by one position in memory. |
QStack<T> | This is a convenience subclass of QVector that provides “last in, first out” (LIFO) semantics. It adds the following functions to those already present in QVector: push(), pop(), and top(). |
QQueue<T> | This is a convenience subclass of QList that provides “first in, first out” (FIFO) semantics. It adds the following functions to those already present in QList: enqueue(), dequeue(), and head(). |
QSet<T> | This provides a single-valued mathematical set with fast lookups. |
QMap<Key, T> | This provides a dictionary (associative array) that maps keys of type Key to values of type T. Normally each key is associated with a single value. QMap stores its data in Key order; if order doesn’t matter QHash is a faster alternative. |
QMultiMap<Key, T> | This is a convenience subclass of QMap that provides a nice interface for multi-valued maps, i.e. maps where one key can be associated with multiple values. |
QHash<Key, T> | This has almost the same API as QMap, but provides significantly faster lookups. QHash stores its data in an arbitrary order. |
QMultiHash<Key, T> | This is a convenience subclass of QHash that provides a nice interface for multi-valued hashes. |
4. 迭代器类
Qt提供了多种风格的迭代器,Java风格和stl风格
4.1. Java风格迭代器
Containers | Read-only iterator | Read-write iterator |
---|---|---|
QList<T>, QQueue<T> | QListIterator<T> | QMutableListIterator<T> |
QLinkedList<T> | QLinkedListIterator<T> | QMutableLinkedListIterator<T> |
QVector<T>, QStack<T> | QVectorIterator<T> | QMutableVectorIterator<T> |
QSet<T> | QSetIterator<T> | QMutableSetIterator<T> |
QMap<Key, T>, QMultiMap<Key, T> | QMapIterator<Key, T> | QMutableMapIterator<Key, T> |
QHash<Key, T>, QMultiHash<Key, T> | QHashIterator<Key, T> | QMutableHashIterator<Key, T> |
4.2. STL风格迭代器
Containers | Read-only iterator | Read-write iterator |
---|---|---|
QList<T>, QQueue<T> | QList<T>::const_iterator | QList<T>::iterator |
QLinkedList<T> | QLinkedList<T>::const_iterator | QLinkedList<T>::iterator |
QVector<T>, QStack<T> | QVector<T>::const_iterator | QVector<T>::iterator |
QSet<T> | QSet<T>::const_iterator | QSet<T>::iterator |
QMap<Key, T>, QMultiMap<Key, T> | QMap<Key, T>::const_iterator | QMap<Key, T>::iterator |
QHash<Key, T>, QMultiHash<Key, T> | QHash<Key, T>::const_iterator | QHash<Key, T>::iterator |
5. Qt提供的其他容器
Qt includes three template classes that resemble containers in some
respects. These classes don’t provide iterators and cannot be used with
the foreach
keyword.
- QVarLengthArray<T, Prealloc> provides a low-level variable-length array. It can be used instead of QVector in places where speed is particularly important.
- QCache<Key, T> provides a cache to store objects of a certain type T associated with keys of type Key.
- QContiguousCache<T> provides an efficient way of caching data that is typically accessed in a contiguous way.
- QPair<T1, T2> stores a pair of elements.
Additional non-template types that compete with Qt’s template containers are QBitArray, QByteArray, QString, and QStringList.
6. Qt容器算法复杂性
Algorithmic complexity is concerned about how fast (or slow) each
function is as the number of items in the container grow. For example,
inserting an item in the middle of a QLinkedList is an extremely fast operation, irrespective of the number of items stored in the QLinkedList. On the other hand, inserting an item in the middle of a QVector is potentially very expensive if the QVector contains many items, since half of the items must be moved one position in memory.
To describe algorithmic complexity, we use the following terminology, based on the “big Oh” notation:
- Constant time: O(1). A function is said to run in constant
time if it requires the same amount of time no matter how many items are
present in the container. One example is QLinkedList::insert(). - Logarithmic time: O(log n). A function that runs in
logarithmic time is a function whose running time is proportional to the
logarithm of the number of items in the container. One example is
qBinaryFind(). - Linear time: O(n). A function that runs in linear time
will execute in a time directly proportional to the number of items
stored in the container. One example is QVector::insert(). - Linear-logarithmic time: O(n log n). A function
that runs in linear-logarithmic time is asymptotically slower than a
linear-time function, but faster than a quadratic-time function. - Quadratic time: O(n?). A quadratic-time function
executes in a time that is proportional to the square of the number of
items stored in the container.
The following table summarizes the algorithmic complexity of Qt’s sequential container classes:
Index lookup | Insertion | Prepending | Appending | |
---|---|---|---|---|
QLinkedList<T> | O(n) | O(1) | O(1) | O(1) |
QList<T> | O(1) | O(n) | Amort. O(1) | Amort. O(1) |
QVector<T> | O(1) | O(n) | O(n) | Amort. O(1) |
In the table, “Amort.” stands for “amortized behavior”. For example,
“Amort. O(1)” means that if you call the function only once, you might
get O(n) behavior, but if you call it multiple times (e.g., n times), the average behavior will be O(1).
The following table summarizes the algorithmic complexity of Qt’s associative containers and sets:
Key lookup | Insertion | |||
---|---|---|---|---|
Average | Worst case | Average | Worst case | |
QMap<Key, T> | O(log n) | O(log n) | O(log n) | O(log n) |
QMultiMap<Key, T> | O(log n) | O(log n) | O(log n) | O(log n) |
QHash<Key, T> | Amort. O(1) | O(n) | Amort. O(1) | O(n) |
QSet<Key> | Amort. O(1) | O(n) | Amort. O(1) | O(n) |
Qt容器类汇总说明的更多相关文章
- Qt——容器类(译)
注:本文是我对Qt官方文档的翻译,错误之处还请指正. 原文链接:Container Classes 介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变 ...
- Qt容器类之二:迭代器
一.介绍 遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目.Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器.如果只是想按顺 ...
- Qt容器类之一:Qt的容器类介绍
一.介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变的QString的数组,则使用QVector<QString>. 这些容器类比STL ...
- Qt容器类——1. QList类、QLinkedList类和QVector类
在开发一个较高性能需求的应用程序时,程序员会比较关注这些容器类的运行效率,表2.1列出了QList.QLinkedList和QVector容器的时间复杂度比较. 1.QList类 QList<T ...
- Qt容器类的对象模型及应用(线性结构篇)(好多图,比较清楚)
用Qt做过项目开发的人,肯定使用过诸如QList.QVector.QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类 ...
- Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)
Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString> ...
- Qt容器类之三:通用算法
在<QtAlgorithm>头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法.我们可以在任何提供了STL风格迭代器的容器类上用这些算法,包括QList.Q ...
- Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)
用Qt做过项目开发的人,肯定使用过诸如QList.QVector.QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类 ...
- Qt Examples Qt实例汇总
ActiveQt Examples Using ActiveX from Qt applications. Animation Framework Examples Doing animations ...
随机推荐
- GCC编译器基础入门
导语 GCC(GNU Compiler Collection,GNU 编译器套件) 是由 GNU 开发的编程语言编译器,支持C.C++.Objective-C.Fortran.Java.Ada和Go语 ...
- C++中的函数
1.函数的定义和调用 函数的定义形式 返回类型 函数名(形式参数) { 语句序列: } 函数的调用 调用:声明函数原型,函数调用 声明函数原型:类型说明符 被调函数名(含类型说明的形参表) 函数调用: ...
- LFS搭建第一天补充
1.选择lfs的iso 2.启动虚拟机,进入以下界面直接按回车键 3. 选择下面的时间 4.直接默认本地时间 5.语言格式选择UTF-8 6.默认 7.直接回车,进入系统 8.对hda盘进行分区,我分 ...
- 数据结构与算法之有序数组(2)——in dart
本文比第一篇,采用了类实现.增加了运算符重载等功能.本来有序数组是不能修改某个位置的值的,因为这样会打破数组的有序性:但为了演示,保留了修改的方法,但为此增加了排序. import 'dart:mat ...
- C++基本概念复习
照着https://www.w3cschool.cn/cpp/,把C++的基础概念顺了一遍,虽然很久没用C++,还是整理一下. #include "stdafx.h"; #incl ...
- 20155218 2006-2007-2 《Java程序设计》第2周学习总结
20155218 2006-2007-2 <Java程序设计>第2周学习总结 教材学习内容总结 java编程风格: java中没有指针的概念,尽管也有数组和对象的引用的概念,但他的管理全部 ...
- 20155317 王新玮 2016-2017-2 《Java程序设计》第5周学习总结
20155317 王新玮 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 异常处理 & Collection与Map 异常继承架构 错误的对象继承ja ...
- 20155328 2016-2017-2 《Java程序设计》第三周学习总结
20155328 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 类是对象的设计图,对象是类的实例.用class定义类,用new新建一个对象. 一个原始码中可 ...
- 【转载】深入理解Direct3D9
原文:Effulgent的<深入理解Direct3D9>整理版(转) 深入理解Direct3D9 深入理解D3D9对图形程序员来说意义重大,我把以前的一些学习笔记都汇总起来,希望对朋友们有 ...
- NIS - 深入了解如何搭建NIS环境
第一篇[NIS]深入了解NIS 1 环境准备 操作系统:CentOS7.2 服务端安装如下软件: 软件名称 功能 ypserv NIS Server端的服务进程 rpcbind 提供RPC服务 ...